2012-02-07 125 views
0

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

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?** 

回答

0

由于您的水果和苹果的目的是通过gcnew实例化,你的清单管理型为好,你会不会需要调用删除水果对象;垃圾收集器会照顾它。

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

最好的做法是为Fruit类定义一个析构函数,并将删除列表代码放在那里。以水果删除通话会自动调用析构函数

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

(Matt的修正后编辑)

+0

谢谢,这是有益的..我真的需要了解内存管理。 – user983924 2012-02-07 08:27:27

+0

这是不正确的。删除不会释放用gcnew创建的这些托管对象的内存。除非这些类实现IDisposable,否则不需要删除调用。除非AppleList实现了IDisposable(即它具有析构函数),否则Fruit不需要析构函数。 – 2012-02-07 14:29:57

+0

啊,是的,感到困惑。由于我们正在讨论gcnew,它由垃圾收集器处理。另一方面,如果你使用新的代码,你需要在内存中释放代码来防止内存泄漏。 – syclee 2012-02-07 23:31:32

0

删除通话将释放内存。使用gcnew分配的内存将被垃圾收集器释放(而不是您的调用删除)。调用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

+0

有什么方法可以在我想要的时候删除对象? – user983924 2012-02-07 14:50:31

+0

你为什么想要?垃圾收集器会帮你照顾它吗?如果你使用本地代码,那么你将自己控制内存管理。 – 2012-02-07 14:52:59

+0

我不使用本机代码。我的程序处理了很多数据,所以我不想等垃圾收集器。在大约两个小时内,我会写我的代码并展示给你。可能有关于我的问题。 – user983924 2012-02-07 16:00:38

0

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

在列表中使用delete不会处理该列表中包含的任何对象。但是,您并未在列表中使用它,而是在父对象上使用它。所以它取决于是否写入父对象来自动处理其子对象。

0

除了非常不寻常的程序,垃圾收集“经常发生”,不需要手动释放对象。你可能遇到的唯一问题是如果你持有大于你需要的大对象的引用。

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

你可以做些什么来解决这个问题,就是试着把你的代码分解成更小的单元,这样你就不会坚持引用远远超过你需要的东西。有时你不能在不破坏代码的逻辑结构的情况下做到这一点,但要记住,你总是可以指定一个变量,以便它不再保存对大对象的引用,这将随后有资格进行垃圾回收。

这有点像手动释放对象,不同之处在于垃圾回收器负责处理来自该对象的任何其他引用,并且可以用相同的方式对其进行编码,即使您无法确定是否对象在程序的其他地方是需要的。如果你手动管理内存,你将不得不提出一些策略来传达对象是否仍然需要,或者保持它“以防万一”(这将是内存泄漏,就像程序中没有其他部分一样使用它,没人会永远释放它)。有了GC,你只需删除你的参考,如果物体在其他地方需要,它会坚持下去,如果不是,它会很快移除。

相关问题