簡體   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