重新初始化指针是一种不好的做法吗?

Is it bad practice to reinitialize a pointer?

本文关键字:一种 指针 初始化      更新时间:2023-10-16

我有一个 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
相关文章: