gpt4 book ai didi

c++ - 使用析构函数删除动态对象? C++

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:57 27 4
gpt4 key购买 nike

在整个程序中,我有几个对象面临着类似的问题。一个例子:

我有一个图像类:

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_ptr或者shared_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];
}
}
}

关于c++ - 使用析构函数删除动态对象? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16754729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com