考虑这个小程序:
int main(int argc, const char *argv[])
{
int *i = new int;
//do something with i, where i is involved all the time
return 0;
}
作为一个好的风格并且表明你确实知道你必须释放在堆上分配的内存,你通常在return语句之前添加delete i;
。
但如果离开delete i;
会不会造成任何伤害?
更新:请不要在评论中互相煽动。我知道只是为了安全起见,就像好风格等问题我应该释放分配的内存。问题是,在特定的案例中是否可以省略安全。
答案 0 :(得分:4)
这应该没关系,因为现代操作系统倾向于在程序终止后清理程序的内存。话虽这么说,我很确定一些较旧的系统不会进行清理,所以如果你瞄准任何这些系统那么你肯定要小心。
无论这两点如何,如果你的代码没有泄漏,你会不会睡得更好?
答案 1 :(得分:3)
不,它不会造成任何伤害,因为系统会自动清除所有未删除的内容 如果您编写的代码除了在程序终止之前使用所有内容,然后您发现需要多次运行它,并且您将在迭代之间发生内存泄漏。
答案 2 :(得分:2)
不会有任何伤害。当操作系统死亡时,操作系统会释放所有进程的内存。
然而,不删除你的变量是一种糟糕的风格,因为它阻碍了Valgrind等工具的使用。
答案 3 :(得分:2)
您的记忆将在现代操作系统中释放,但这并不意味着将调用析构函数。
这是一种不好的做法。不要这样做。请改用智能指针。
答案 4 :(得分:1)
如果使用内存跟踪工具查找内存泄漏,则顶级的不平衡allocs / deallocs将显示为泄漏。这会分散您对查找真实内存泄漏的任务的注意力。除此之外,您是安全的:操作系统将为您释放内存和其他资源。
答案 5 :(得分:1)
内存应由大多数操作系统检索并捐赠回堆。但你会依赖它吗?请参阅我认为您的具体示例已设置为看起来无辜。是程序完成,然后操作系统抢回您忘记取消分配的所有内存。唯一的问题是,只要你的程序变得更大并且将用于任何目的并且有人让它运行,那么你基本上就是“窃取”可用于运行的其他服务的内存。
a)永远不要浪费系统资源(内存,处理能力,端口,插座......)
b)返回您不需要的任何内容,还有其他进程与您一起运行。
我认为你建模了一个基本上依赖于你的应用程序被终止的场景,但并不一定如此。
答案 6 :(得分:0)
我认为在这个例子中它不会受到影响,因为无论如何程序都会退出,并且大多数操作系统应该只在堆上提供该内存。但是你最好在使用变量后添加一个删除语句。
答案 7 :(得分:-4)
如果在调试模式下运行代码,将以不同方式跟踪分配的内存,并在程序终止时释放。但是如果你在发布模式下运行程序会导致内存泄漏,如果你反复运行你的程序,最终系统上的所有内存都将被分配而不会被释放,导致内存不足和所有其他不好的事情。
因此它不仅仅是良好的编码风格。