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 结构的动态二维数组,但我不确定何时何地删除它。我在我的 Image 析构函数中实现了以下内容,但我不能 100% 确定它正在完成这项工作,我不确定如何检查它是否有效:

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

    delete[] pixels;
    pixels = NULL;
}

我是否正确实现了内存释放?

4

3 回答 3

3

没关系。

两点,你可以使用unique_ptrorshared_ptr和摆脱自我删除的记忆。

其次,我更喜欢使用nullptror0而不是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];
        }
    }
}
于 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 回答