重新初始化指针是一种不好的做法吗?
Is it bad practice to reinitialize a pointer?
我有一个 Image 类,最初我不知道图像尺寸,所以我只是将一个data_
指针初始化为大小为 0 的数组。稍后,当我找到图像信息时,我将data_
重新初始化为新大小。这会在内存中产生任何问题吗?有没有更清洁的方法可以做到这一点?
以下是我写的类:
class Image
{
private:
int numRows_, numCols_;
unsigned char* data_;
public:
Image() : numRows_(0), numCols_(0), data_(new unsigned char[0])
{}
void setData(int r, int c, unsigned char* data)
{
this->numRows_ = r;
this->numCols_ = c;
this->data_ = new unsigned char[r*c];
for (int i = 0; i < r*c; i++)
{
this->data_[i] = data[i];
}
}
int rows();
int cols();
unsigned char* data();
~Image();
};
提前致谢
这实际上会泄漏内存。对new
的调用为数组分配内存,即使数组为空。一旦重新分配data_
,以前的数组就会泄漏,无法再释放。
您可以确保delete[]
分配的任何new[]
,或者只是不分配空数组,而是将data_
设置为nullptr
,直到您有有意义的数据可以使用。
一个更好的主意是不允许创建处于无效状态的对象,需要在构造函数中使用数据 - 请参阅 RAII:
在 RAII 中,持有资源是一个类不变量,并且与 对象生存期:资源分配(或获取)在 对象创建(特别是初始化),由构造函数, 而资源释放(释放)是在对象期间完成的 析构函数销毁(特别是最终确定)。
如果您决定保留setData
,那么如注释中所述,您还必须确保在重新分配data_
之前delete[]
setData
中的现有数据,以防该方法被多次调用。
我认为更干净的方法是使用向量:
std::vector<unsigned char> v; // vector with size 0
v.resize(r*c); // after size is known, just resize
相关文章:
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 在类方法中使用 "this" 指针是否是一种好的做法?
- free():仅在一种情况下指针无效
- 如何测试指针类型是否可以安全地转换为另一种指针类型?
- 重新初始化指针是一种不好的做法吗?
- 是否有一种方法可以访问/解除并找到存储在双指针向量中的元素的值
- 将指向结构的指针转换为具有较少字段数的另一种结构类型
- 有没有一种 stl 方法来执行指针向量的深度复制
- 在比较中使用已强制转换为另一种类型的函数指针是否定义良好?
- 返回一个原始指针而不是unique_ptr是一种良好的编码实践吗
- 这是否仍然声明一种指针函数的别名?
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- 将"this"指针强制转换为另一种类型不违反严格锯齿?
- 想要一种在C++中交换两个指针的有效方法
- 有没有一种方法可以获取在处理信号期间访问的指针