应该在main中的return语句之前释放内存吗?
Should memory be freed just before return statement in main?
考虑这个小程序:
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语句。
如果您在调试模式下运行代码,分配的内存将以不同的方式被跟踪,并将在程序终止时释放。但是,如果你在释放模式下运行程序,它会导致内存泄漏,如果你一遍又一遍地运行你的程序,最终系统上的所有内存将被分配,而不是释放,导致低内存和所有其他糟糕的事情。
所以它不仅仅是好的编码风格。
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?