![](/img/trans.png)
[英]Array access on a Getter that returns a pointer, is that bad practice?
[英]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.