当前位置:  开发笔记 > 编程语言 > 正文

当程序退出时,是否有理由在C++中调用delete?

如何解决《当程序退出时,是否有理由在C++中调用delete?》经验,为你挑选了5个好方法。

main例如,在我的C++ 函数中,如果我有一个指向使用堆内存的变量的指针(而不是堆栈内存) - 在我的应用程序退出后会自动解除分配吗?我会这么认为.

即便如此,即使您认为永远不会在退出时自动释放内存的情况下使用堆分配,也总是删除堆分配是一种好习惯吗?

例如,这样做有什么意义吗?

int main(...)
{
    A* a = new A();
    a->DoSomething();
    delete a;
    return 0;
}

我想也许以防我重构(或其他人重构)代码并将其放在应用程序的其他地方,这delete真的是必要的.

除了Brian R. Bondy(其中特别谈到C++中的含义)的答案之外,Paul Tomblin 对C特定问题也有一个很好的答案,该问题也讨论了C++析构函数.



1> Brian R. Bon..:

显式调用delete非常重要,因为您可能在析构函数中有一些要执行的代码.就像将一些数据写入日志文件一样.如果让操作系统为您释放内存,则不会执行析构函数中的代码.

大多数操作系统将在程序结束时释放内存.但是好的做法是自己解除分配,就像上面说的那样操作系统不会调用你的析构函数.

至于通常调用delete,是的,你总是想调用delete,否则你的程序会有内存泄漏,这将导致新的分配失败.


不要忘记,类成员也可以保存一些不会随程序结束而自动消失的内容,例如套接字或连接等.内存不是泄漏的唯一因素,并非所有泄漏都可以自动清除.

2> Ferruccio..:

是的,当您通过内存泄漏检测工具运行程序时,它有助于消除误报.


一个免费的MSVC++是Visual Leak Detector(运行互联网搜索 - 你很容易找到它)

3> Lightness Ra..:

是.

该标准不保证操作系统将清理内存.您可以在主流平台上看到这一点,但为什么要冒这个机会呢?

如果不故意泄漏内存,可以最大限度地减少valgrind等工具报告的混乱.

如果你养成这种习惯,谁会说你有一天不会意外地在某个地方应用这种方法呢?

可能需要破坏对象.通常只是假设你这样做.它不伤害你.


第三点对我来说是最吸引人的。仅总是删除您的分配要比总是尝试确定什么时候合适要少。让我想起了汽车转向灯-我一直想知道为什么人们有时会不愿意使用它;为什么?最好使它成为一种习惯,而您根本不需要考虑它。

4> Sebastian Ma..:

考虑要删除的对象获取OS无法安全释放的外部资源的情况.如果你没有在该对象上调用delete,则会出现真正的泄漏.



5> Stefan..:

想想你的班级A必须要毁灭.
如果你不叫deletea,那析构函数将不会被调用.通常,如果过程结束,那将无关紧要.但是如果析构函数必须释放数据库中的对象呢?将缓存刷新到日志文件?将内存缓存写回磁盘?

你知道,删除对象不仅仅是"好习惯",在某些情况下它是必需的.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有