应该在main中的return语句之前释放内存吗?

Should memory be freed just before return statement in main?

本文关键字:释放 内存 语句 main 中的 return      更新时间:2023-10-16

考虑这个小程序:

int main(int argc, const char *argv[])
{
    int *i = new int;
    //do something with i, where i is involved all the time
    return 0;
}

作为一种良好的风格,并表明你实际上知道你必须释放堆上分配的内存,你通常在返回语句之前添加delete i;

但是如果把delete i;去掉会有什么害处吗?

更新:请不要在评论中互相攻击。我只知道,为了安全起见,为了更好的风格,我应该释放分配的内存。问题是,在这种特殊的情况下,是否可以安全地提交

这应该无关紧要,因为现代操作系统倾向于在程序终止后清理程序的内存。话虽如此,我很确定一些较旧的系统不会进行清理,所以如果您的目标是这些系统中的任何一个,那么您一定要小心。

不管这两点,知道你的代码没有泄漏,你会睡得更好吗?

不会,系统会自动清除所有未删除的。
如果您编写的代码除了在程序终止之前使用所有内容外,然后您发现需要多次运行它,并且在迭代之间会出现内存泄漏,那么危害将会很大。

不会有任何伤害的。当进程死亡时,操作系统将释放该进程的所有内存。

然而,不删除变量是一种糟糕的风格,因为它阻碍了Valgrind等工具的使用。

您的内存将在现代操作系统上被释放,但这并不意味着将调用析构函数。

这是一个不好的做法。不要这样做。

如果您使用内存跟踪工具来查找内存泄漏,则来自顶层的不平衡分配/deallos将显示为泄漏。这将分散您寻找真正内存泄漏的任务。除此之外,您是安全的:操作系统将为您释放内存和其他资源。

内存应该被大多数操作系统检索并捐赠回堆。但你会依赖它吗?你看,我认为你的具体例子看起来是无辜的。是的,程序结束后,操作系统会把你忘记取消分配的所有内存夺回来。唯一的问题是,一旦你的程序变得更大,将有任何目的,有人让它运行,那么你基本上是"窃取"内存,可以用于其他服务运行。

a)永远不要浪费系统资源(内存,处理能力,端口,插座…)

b)返回你不需要的任何东西,还有其他进程与你的进程一起运行。

我想你模拟了一个场景,基本上依赖于你的应用程序被终止,这并不一定是这种情况。

我认为在这个例子中,它不会有什么坏处,因为程序无论如何都会退出,大多数操作系统应该只是在堆上重新提供可用的内存。但是你最好在使用完变量后加上一个delete语句。

如果您在调试模式下运行代码,分配的内存将以不同的方式被跟踪,并将在程序终止时释放。但是,如果你在释放模式下运行程序,它会导致内存泄漏,如果你一遍又一遍地运行你的程序,最终系统上的所有内存将被分配,而不是释放,导致低内存和所有其他糟糕的事情。

所以它不仅仅是好的编码风格。