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