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

Ijl*_*lal 3 c++

我有一个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();
};
Run Code Online (Sandbox Code Playgroud)

提前致谢

Rot*_*tem 7

这实际上会泄漏内存.调用new为数组分配内存,即使它是空的.一旦重新分配data_,前一个阵列就会泄漏,无法再释放.

您既可以确保分配delete[]任何new[]内容,也可以不分配空数组,而是设置data_nullptr直到您拥有有意义的数据.

更好的想法是不允许在无效状态下创建对象,需要构造函数中的数据 - 请参阅RAII:

在RAII中,持有资源是类不变的,并且与对象生存期相关联:资源分配(或获取)在对象创建(特别是初始化)期间由构造函数完成,而资源释放(释放)在对象销毁期间完成(具体完成),由析构函数.

如果您决定保留setData,那么如评论中所述,您还必须确保在重新分配之前delete[]存在现有数据,以防该方法被多次调用.setDatadata_