0

プログラム全体で、同様の問題に直面しているオブジェクトがいくつかあります。一例:

私は画像クラスを持っています:

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 構造体の動的な 2 次元配列を作成することですが、それをいつどこで削除すればよいかわかりません。Image デストラクタに以下を実装しましたが、それが機能していることを 100% 確信しているわけではなく、機能しているかどうかを確認する方法もわかりません。

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

    delete[] pixels;
    pixels = NULL;
}

メモリの割り当て解除を正しく実装していますか?

4

3 に答える 3

3

大丈夫です。

2点、メモリを削除して自己消去して使用unique_ptrすることができます。shared_ptr

2 つ目は、 (標準ではありますが) の代わりにnullptrorを使用することを好みます。さらに、コンテナー オブジェクトは破棄されるため、そのメンバーを null に設定する必要はありません。0NULL

そして、最高の使用は次の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];
        }
    }
}
于 2013-05-25T23:12:57.903 に答える
2

メモリの割り当て解除を正しく実装していますか?

はい。正しいです。ただし、2D 動的配列を に置き換えることをお勧めしますvector of vectors。これは、メモリを単独で管理し、より安全でエラーが発生しにくいものです。

于 2013-05-25T23:11:02.653 に答える
2

ここに RAII がなく、bad_alloc のような潜在的な例外がスローされ、オブジェクトが未定義の状態のままになるという問題が見られます。メモリを管理するオブジェクトにメモリを割り当てるので、オブジェクトがスコープ外になると、それ自体が破壊されます。このオブジェクトは、メモリをディープコピーし、最初のバイトへのポインターを介して生データにアクセスできるようにするコピーコンストラクターも提供する必要があります。std::vector にはこれらすべての属性があります。

于 2013-05-25T23:19:07.803 に答える