gpt4 book ai didi

c++ - 堆对象内的局部数组 - C++

转载 作者:行者123 更新时间:2023-11-27 23:48:02 28 4
gpt4 key购买 nike

出于示例的目的 - 我有几个类:

class RGB {
short value[3];
};

class AbstractImage {
protected:
int n_pixels;

public:
virtual ~AbstractImage() {};
}

template <typename T> class Image : public AbstractImage {
T* data;

public:
Image<T>(int n) { n_pixels=n; data=new T[n_pixels]; }
virtual ~Image<T>() {delete[] data;}

// also provided is a copy constructor and assignment operator overloading

};
typedef class Image<RGB> ColorImage;

Image 是否存在内存泄漏?我是否需要用删除一个一个释放RGB对象?或者没有泄漏?

根据我的理解:数据指向在堆上创建的内容(使用"new"一词),它包含一个大小为 n_pixels 的 RGB 对象数组(它有一个名为“value”的数组,其中包含 3 个单元格 - 也在堆)。这意味着我们需要一个一个地删除每个对象。

最佳答案

Is there a memory leak from Image?

没有。您将 new[]delete[] 相匹配。当然,如果您泄漏包含 Image 的对象并且永远不会销毁,它可能会泄漏。您包含一个虚拟析构函数(我认为这意味着您删除 指向AbstractImage 的指针)确保最派生的类自行清理。

Do I need to release the RGB objects one by one with delete?

不,因为您没有使用 new 单独分配它们中的任何一个。动态分配数组的每个成员都位于分配的 block 中。它在您分配数组时默认初始化,然后在您delete[] 整个数组时调用其析构函数。语言规范涵盖了它。

话虽如此,如果您需要管理对象缓冲区,使用 std::vector 几乎总是更好的选择。

关于c++ - 堆对象内的局部数组 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48987406/

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