当使用C ++如动态分配的对象:
TGraph* A = new TGraph(...);
每个人都应该delete
这些,因为否则的对象仍可能在内存中,当控制被传递回父范围。 虽然我能看到为什么这是一个程序的子范围和子程序真的,但在相同的计main
范围是什么?
我是否一定要delete
该进行动态里面内置对象main()
为什么这似乎有点redudant给我的理由是,当main
端,程序也结束,所以没有必要担心内存泄漏。
当使用C ++如动态分配的对象:
TGraph* A = new TGraph(...);
每个人都应该delete
这些,因为否则的对象仍可能在内存中,当控制被传递回父范围。 虽然我能看到为什么这是一个程序的子范围和子程序真的,但在相同的计main
范围是什么?
我是否一定要delete
该进行动态里面内置对象main()
为什么这似乎有点redudant给我的理由是,当main
端,程序也结束,所以没有必要担心内存泄漏。
大多数现代操作系统的始终不退回到他们分配到一个程序(过程)的所有内存。
操作系统并不真正了解你的程序泄漏内存它只是收回什么allocatted。
但也有手头更大的问题不仅仅是记忆力减退:
请注意,如果对象卫生组织的析构函数delete
需要被调用执行一些非平凡的操作和程序取决于它所产生的副作用,那么你的程序属于猎物不确定的行为 [参考文献1]。 一旦出现这种情况所有的赌注都关闭,你的程序可以显示任何beahvior。
而且,通常OS回收分配的内存而不是其他的资源,所以你可能会间接地泄露这些资源。 这可能包括业务处理文件描述符或程序本身等的状态
因此,这是一个很好的做法,始终释放了所有的分配通过调用delete
或delete []
退出程序前。
[参考文献1] C ++ 03标准3.8第4段:
” .... 如果有析构函数,或者如果delete表达式(5.3.5)不用于释放存储,析构函数应不被隐式地调用,并且依赖于所产生的侧e FF学分任何程序中没有显式调用在析构函数理解过程科幻定义的行为 “。
IMO最好是随时拨打delete
正确:
main
范围 是的,你应该叫delete
,至少因为它是最好的做法。 如果你在析构函数中具有重要的逻辑,这是一个额外的理由,你应该叫delete
。
更正:如果程序在析构函数依赖于逻辑,不是要求delete
明确导致不确定的行为。
为什么这似乎有点redudant给我的理由是,当主端,程序也结束,所以没有必要担心内存泄漏。
你是对的,但考虑到这一点:您创建打开远程数据库连接的类对象。 之后你的程序将完成,你应该告诉DB“我完了,我要去断开”,但它不会在你不会叫正常删除的情况下发生的。
它的最佳实践,以取消分配一个已经分配的内存。 你应该记住,堆内存是有限的,只是走出去分配分配程序运行可能遇到的堆空间了一些其他/或同一个程序(而如果某种,是为了运行一个守护进程很长一段时间),需要堆。
当然,内存将被操作系统在程序的执行结束时被回收。
我看你是用root(CMS家伙?)。 我想ROOT注意到了这一问题,并清理,不是吗?
最佳做法:
new
,使用自动分配 你不应该有写delete
的应用性代码。
在这里,你为什么叫new
的TGraph
?
TGraph A(...);
效果更好:较少的后顾之忧!