繁体   English   中英

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

[英]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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM