2

在阅读有关什么是内存泄漏的答案后,可以得出结论,如果对象应该在所有程序运行期间都存在,并且是通过创建的new,则无需调用delete此类对象。

因此,例如,如果我有一些主窗口和其他一些窗口/小部件,我在主窗口构造函数中使用 new 创建,我不需要在析构函数中调用 delete,因为将调用主窗口析构函数程序退出,所以它不是内存泄漏。

4

4 回答 4

3

直到您的程序成为更大程序(例如 servlet)中的一个模块,此时您就有了泄漏。

它还会掩盖您的代码审查和对 valgrind 的使用。valgrind 会认为这是一个泄漏,为什么每次您尝试在其他地方追踪泄漏时都必须记住“那个很好”?

于 2013-04-06T21:07:22.683 回答
3

'因为程序退出时会调用主窗口析构函数,所以不是内存泄漏

这是内存泄漏,但您可以依赖这样一个事实,即操作系统将在进程终止时释放您的进程使用的资源(至少是内存)——即使进程本身没有采取行动主动执行此操作。

但是,当需要释放其他类型的资源(例如文件句柄或网络连接)时,情况可能并非如此。更一般地,当具有这些职责的程序或模块没有履行其他类型的职责时。

不泄漏内存是您的程序的责任,并且以您编写的模块将履行其职责的方式练习编程是很好的。用于此目的的工具和习语足够通用,足以证明在有意义的情况下练习它们的使用是合理的。例如,RAII 习语(资源获取是初始化)在这方面是基本的,它也可以应用于您的示例 - 使用智能指针。

尽管在特定示例中您提到内存泄漏不会是一个大问题(内存消耗不会随着程序运行而持续增长,因为我们正在谈论一个对象),但没有真正的理由保留它在那里。

于 2013-04-06T21:08:26.843 回答
2

当您启动程序时,操作系统将创建一个进程,其中包含运行该程序所需的所有信息。
当进程被破坏时,例如通过关闭主窗口,操作系统将(不是立即)从内存中清理进程的图像,并且您的内存泄漏将消失。
p如果您有一个长时间运行的进程并造成内存泄漏,这将成为一个问题,因此该进程将死亡或操作系统开始运行缓慢。

于 2013-04-06T21:07:20.280 回答
2

最好delete自己养成 ing 内存的习惯(或使用智能指针),因为代码会随着时间而变化,谁知道该对象是否会在未来持续整个程序的生命周期,当您(或下一个开发人员)早就忘记了你deletenew.

于 2013-04-06T21:08:11.250 回答