簡體   English   中英

使用析構函數刪除動態對象? C ++

[英]Deleting dynamic objects with a destructor? C++

在整個程序中,我有一些對象面臨類似的問題。 一個例子:

我有一個Image類:

class Image
{
public:
    Image();
    Image(const Image& copy);
    ~Image();

    void loadimage(string filename);
    void saveimage(string filename);
    Image superimpose(const Image& ontop, Color mask);

    int getwidth();
    int getheight();
    Image operator=(const Image&);

protected:    
    Color** pixels;
    int width;
    int height;
    ImageLoader* loader;
};

它具有一個副本構造函數:

Image::Image(const Image& copy)
{
    width = copy.width;
    height = copy.height;
    loader = copy.loader;

    pixels = new Color*[height];
    for(int i = 0; i < height; i++)
    {
        pixels[i] = new Color[width];
    }

    for(int h = 0; h < height; h++)
    {
        for(int w = 0; w < width; w++)
        {
            pixels[h][w] = copy.pixels[h][w];
        }
    }
}

顏色是一個結構:

struct Color
{
    unsigned int r;
    unsigned int g;
    unsigned int b;
};

我擔心的是,我創建了一個動態的二維Color結構數組,但不確定何時何地刪除它。 我在Image析構函數中實現了以下內容,但我不能100%地確定它正在執行此工作,而且我不確定如何檢查它是否起作用:

Image::~Image()
{
    for(int i = 0; i < height; i++)
    {
        delete[] pixels[i];
    }

    delete[] pixels;
    pixels = NULL;
}

我是否正確實現了內存釋放?

沒關系。

有兩點,您可以使用unique_ptrshared_ptr並擺脫自我刪除內存的unique_ptr

其次,我更喜歡使用nullptr0而不是NULL (盡管這是標准的) 此外,由於容器對象正在銷毀,因此您無需將其成員設置為null。

最好是使用std::vector

std::vector<std::vector<Color>> pixels;

...

Image::Image(const Image& copy)
{
    width = copy.width;
    height = copy.height;
    loader = copy.loader;

    pixels.resize(height);
    for (int i = 0; i < height; i++)
    {
        pixels[i].resize(width);
    }

    for(int h = 0; h < height; h++)
    {
        for(int w = 0; w < width; w++)
        {
            pixels[h][w] = copy.pixels[h][w];
        }
    }
}

我是否正確實現了內存釋放?

是。 它是正確的。 但是,最好用vector of vectors替換2D動態數組,它可以自己管理內存,更安全,更不易出錯。

我在這里看到缺少RAII,並拋出了諸如bad_alloc之類的潛在異常問題,這會使您的對象處於未定義狀態。 我會在一個為您管理內存的對象中分配內存,因此,當對象超出范圍時,它將破壞自身。 該對象還應提供一個復制構造器,該構造器可以深度復制內存並允許您通過指向第一個字節的指針訪問原始數據。 std :: vector具有所有這些屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM