C ++是有必要在主范围的端部删除动态分配对象?(C++ is it necessary to de

2019-09-16 16:18发布

当使用C ++如动态分配的对象:

TGraph* A = new TGraph(...);

每个人都应该delete这些,因为否则的对象仍可能在内存中,当控制被传递回父范围。 虽然我能看到为什么这是一个程序的子范围和子程序真的,但在相同的计main范围是什么?

我是否一定要delete该进行动态里面内置对象main() 为什么这似乎有点redudant给我的理由是,当main端,程序也结束,所以没有必要担心内存泄漏。

Answer 1:

大多数现代操作系统的始终不退回到他们分配到一个程序(过程)的所有内存。
操作系统并不真正了解你的程序泄漏内存它只是收回什么allocatted。

但也有手头更大的问题不仅仅是记忆力减退:

请注意,如果对象卫生组织的析构函数delete需要被调用执行一些非平凡的操作和程序取决于它所产生的副作用,那么你的程序属于猎物不确定的行为 [参考文献1]。 一旦出现这种情况所有的赌注都关闭,你的程序可以显示任何beahvior。

而且,通常OS回收分配的内存而不是其他的资源,所以你可能会间接地泄露这些资源。 这可能包括业务处理文件描述符或程序本身等的状态

因此,这是一个很好的做法,始终释放了所有的分配通过调用deletedelete []退出程序前。


[参考文献1] C ++ 03标准3.8第4段:

” .... 如果有析构函数,或者如果delete表达式(5.3.5)不用于释放存储,析构函数应不被隐式地调用,并且依赖于所产生的侧e FF学分任何程序中没有显式调用在析构函数理解过程科幻定义的行为 “。



Answer 2:

IMO最好是随时拨打delete正确:

  • 使其自动习惯,使其不太可能忘记它,当真正需要它
  • 覆盖情况下,当非内存资源(套接字,文件句柄,...)需要被释放 - 这是不会自动释放OS
  • 以满足未来重构当有问题的代码可能会被移出的main范围


Answer 3:

是的,你应该叫delete ,至少因为它是最好的做法。 如果你在析构函数中具有重要的逻辑,这是一个额外的理由,你应该叫delete

更正:如果程序在析构函数依赖于逻辑,不是要求delete明确导致不确定的行为。



Answer 4:

为什么这似乎有点redudant给我的理由是,当主端,程序也结束,所以没有必要担心内存泄漏。

你是对的,但考虑到这一点:您创建打开远程数据库连接的类对象。 之后你的程序将完成,你应该告诉DB“我完了,我要去断开”,但它不会在你不会叫正常删除的情况下发生的。



Answer 5:

它的最佳实践,以取消分配一个已经分配的内存。 你应该记住,堆内存是有限的,只是走出去分配分配程序运行可能遇到的堆空间了一些其他/或同一个程序(而如果某种,是为了运行一个守护进程很长一段时间),需要堆。

当然,内存将被操作系统在程序的执行结束时被回收。



Answer 6:

我看你是用root(CMS家伙?)。 我想ROOT注意到了这一问题,并清理,不是吗?



Answer 7:

最佳做法:

  1. 不要使用new ,使用自动分配
  2. 当动态分配是必要的,使用RAII以确保自动清理

你不应该有写delete的应用性代码。

在这里,你为什么叫newTGraph

TGraph A(...);

效果更好:较少的后顾之忧!



文章来源: C++ is it necessary to delete dynamically allocated objects at the end of the main scope?