2017-06-01 34 views
3

我有一个图像类,最初我不知道图像尺寸,所以我只是初始化一个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(); 
}; 

在此先感谢

+5

任何理由不只是将其设置为'nullptr'? – Rotem

+0

很高兴看到您的析构函数实现... –

+4

您不能重新初始化东西。初始化只进行一次。你之后做的任何事情只是任务。 –

回答

7

这实际上将泄漏内存。 new的调用为阵列分配内存,even if it is empty。只要你重新分配data_,前面的数组就会泄漏,不能再被释放。

您可以确保您delete[]你分配,或者只是不分配一个空数组,而是设置data_nullptr,直到你有有意义的数据使用任何new[]

一个更好的想法是不允许处于无效状态的对象的创建,需要在构造函数中的数据 - 见RAII

在RAII,拿着一个资源是一类不变,并且被绑定到 对象寿命:资源分配(或获取)被 对象创建(具体初始化)期间进行,由该构造, 而资源解除分配(释放)对象 破坏(特别是最后完成)期间完成的,通过析构。

如果你决定保留setData,然后在评论中提到,你也必须重新分配data_,如果该方法被多次调用之前一定要delete[]现有数据setData

+0

感谢@Rotem我要使用nullptr这个时间,但只是出于好奇是明智调用delete []私人指针'的公共方法data_'使用一个?我有一种感觉,如果可能的话应该避免。 – Ijlal

+0

@Ijlal为什么会引入这种危险? – Rotem

3

我认为一个更清洁的方式这样做将使用向量:

std::vector<unsigned char> v; // vector with size 0 
v.resize(r*c);     // after size is known, just resize