main
例如,在我的C++ 函数中,如果我有一个指向使用堆内存的变量的指针(而不是堆栈内存) - 在我的应用程序退出后会自动解除分配吗?我会这么认为.
即便如此,即使您认为永远不会在退出时自动释放内存的情况下使用堆分配,也总是删除堆分配是一种好习惯吗?
例如,这样做有什么意义吗?
int main(...) { A* a = new A(); a->DoSomething(); delete a; return 0; }
我想也许以防我重构(或其他人重构)代码并将其放在应用程序的其他地方,这delete
真的是必要的.
除了Brian R. Bondy(其中特别谈到C++中的含义)的答案之外,Paul Tomblin 对C特定问题也有一个很好的答案,该问题也讨论了C++析构函数.
显式调用delete非常重要,因为您可能在析构函数中有一些要执行的代码.就像将一些数据写入日志文件一样.如果让操作系统为您释放内存,则不会执行析构函数中的代码.
大多数操作系统将在程序结束时释放内存.但是好的做法是自己解除分配,就像上面说的那样操作系统不会调用你的析构函数.
至于通常调用delete,是的,你总是想调用delete,否则你的程序会有内存泄漏,这将导致新的分配失败.
是的,当您通过内存泄漏检测工具运行程序时,它有助于消除误报.
是.
该标准不保证操作系统将清理内存.您可以在主流平台上看到这一点,但为什么要冒这个机会呢?
如果不故意泄漏内存,可以最大限度地减少valgrind等工具报告的混乱.
如果你养成这种习惯,谁会说你有一天不会意外地在某个地方应用这种方法呢?
您可能需要破坏对象.通常只是假设你这样做.它不伤害你.
考虑要删除的对象获取OS无法安全释放的外部资源的情况.如果你没有在该对象上调用delete,则会出现真正的泄漏.
想想你的班级A
必须要毁灭.
如果你不叫delete
上a
,那析构函数将不会被调用.通常,如果过程结束,那将无关紧要.但是如果析构函数必须释放数据库中的对象呢?将缓存刷新到日志文件?将内存缓存写回磁盘?
你知道,删除对象不仅仅是"好习惯",在某些情况下它是必需的.