删除对象时,删除的对象是否也被删除?

时间:2012-02-07 06:37:13

标签: .net memory-leaks c++-cli delete-operator

我有一个主要对象。它拥有许多包含其他对象的数组。我想知道,当我删除主要对象时,是否会释放所有内存(主要对象和数组以及数组的对象(元素))?例如:

Fruit^  my_fruit = gcnew Fruit;
Apple^  first_apple = gcnew Apple;
Apple^  second_apple = gcnew Apple;
my_fruit->AppleList->Add(first_apple);
my_fruit->AppleList->Add(second_apple);

// some operations

delete my_fruit; // **is it enough to avoid memory leak, is it necessary to delete first and second apple objects?**

4 个答案:

答案 0 :(得分:0)

由于您的Fruit和Apple对象是由gcnew实例化的,并且您的列表也是托管类型,因此您不需要在fruit对象上调用delete;垃圾收集器会处理它。

另一方面,如果说Fruit对象中的列表是非托管类型,则是,您需要显式内存释放代码来释放列表,因为垃圾收集器不知道或不关心为该列表分配的内存

最佳做法是为Fruit类定义析构函数,并将删除列表代码放在那里。对Fruit的删除调用将自动调用析构函数

http://msdn.microsoft.com/en-us/library/248aa748(v=vs.80).aspx

(马特修正后编辑)

答案 1 :(得分:0)

删除调用将释放内存。使用gcnew分配的内存将被垃圾收集器释放(而不是通过调用delete)。调用delete将调用析构函数(类似于C#中的Dispose)。请参阅以下内容: http://bytes.com/topic/net/answers/735989-gcnew http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/19e35d8c-94c2-4ea0-8e27-8e5cb94e898e/ http://msdn.microsoft.com/en-us/library/ms177197(VS.80).aspx

答案 2 :(得分:0)

您没有内存泄漏。对于托管类型,内存由垃圾收集器释放(正如Matt和sp1ky已经说过的那样)。 delete关键字用于配置对象。

在列表中使用delete将不会处置该列表中包含的任何对象。但是,您没有在列表中使用它,而是在父对象上使用它。因此,它取决于是否编写父对象以自动处理其子对象。

答案 3 :(得分:0)

除了非常不寻常的程序之外,垃圾收集将“经常发生”,无需手动解除分配对象。您可能遇到的唯一问题是,如果您持有的对大对象的引用超出了您的需要。

e.g。如果在同一个函数中加载并处理两个巨大的集合,并将它们存储在两个不同的变量中,那么当您处理第二个集合时,保存第一个集合的变量仍然存在。如果您实际上不再需要第一个集合,则在您从函数返回之前,垃圾收集器可能不会注意到,然后两个集合都超出范围。如果这两个集合不能同时适应内存,那可能不会很快。

你可以做的是尝试将你的代码分解成更小的单位,这样你就不会比你需要的时间长得多。有时你不能在不破坏你的代码的逻辑结构的情况下做到这一点,但是请记住,你总是可以分配给一个变量,这样它就不再拥有对大对象的引用,这将有资格进行垃圾回收。

这有点像手动释放对象,除了垃圾收集器负责处理从该对象引用的任何其他内容,并且即使您无法确定对象是否也可以以相同的方式对其进行编码在该计划的其他地方需要。如果你手动管理内存,你将被迫提出一些策略,用于通信是否仍然需要该对象,或者保持“以防万一”(这将是一个内存泄漏,好像没有程序的其他部分使用它没有人会永远释放它)。随着GC为您解决这个问题,您只需删除您的参考,如果其他地方需要该物体,它将会粘在一起,如果没有,它将很快被移除。