免费/删除 - 如果我不打电话怎么办
free/delete - what if I don't call them
我知道,如果我不使用delete/free释放分配的内存,我最终会出现内存泄漏。我的问题是:如果我的程序被终止,即使我没有,操作系统是否会为我释放内存?
简而言之,是的。
当进程终止时,映射到进程地址空间的所有存储都将返回到操作系统,即使您没有明确释放它。
在C++中,删除将导致被调用对象的析构函数。这个析构函数可以处理除释放内存之外的其他事情。它可能会关闭文件、减少引用计数等。因此,如果您忽略了删除动态分配的对象,就不知道会出什么问题。
内存是否泄漏取决于操作系统。在大多数操作系统的情况下,一旦程序运行的进程退出,操作系统只需收回分配给该进程的内存。
它还有另一个重要方面。new
导致调用类构造函数,delete
导致调用析构函数。因此,如果您调用了new
,但从未调用过delete
,那么除了所谓的内存泄漏(在程序退出后可能不存在)之外,还有一个附加条件,即如果特定类的析构函数调用了一些具有副作用的代码,则会导致Undefined Behavior。
所以答案是取决于,你可能有:
- 内存泄漏(取决于操作系统行为)
- 未定义的行为(取决于析构函数中的代码是否有副作用)
C++11标准3.8对象生存期:
第4段:
程序可以通过重用对象所占用的存储,或者通过显式调用具有非平凡析构函数的类类型对象的析构函数,来结束任何对象的生存期。对于具有非平凡析构函数的类类型的对象,程序不需要在存储之前显式调用析构函数物体所占据的空间被重新使用或释放;然而,如果没有对析构函数的显式调用,或者如果没有使用删除表达式(5.3.5)来释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为
如果不调用delete
,则不会调用析构函数。如果任何析构函数关闭文件、向数据库写入内容等,则这些操作将不会完成
您的问题似乎是基于对内存如何工作的天真理解,而这与现代操作系统的工作方式不符。"内存"这个词是令人困惑的模棱两可的,你真的应该分别考虑物理内存(RAM)和虚拟内存(地址空间)。
当您调用malloc
时,您会在进程中保留地址空间。如果操作系统认为这样做是明智的,它会用物理RAM来支持地址空间。如果操作系统想将RAM用于其他用途,它只需要这样做。你无法阻止它。所以你不必担心RAM。操作系统足够智能,即使进程没有专门释放RAM,也能始终将其最佳利用。
仅仅是地址空间的虚拟内存并不稀缺。一旦您的进程终止,您的地址空间就不存在了。所以没有什么可回报的。
一旦内存无法访问,操作系统就别无选择,只能释放内存。
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 这些老式的演员怎么办?
- 如果参数与数据成员的参数同名,该怎么办?
- MacOS 10.14b / C++使用:找不到命令,该怎么办?
- 我的 cout 上有一个奇怪的输出,它把答案放在第一位,然后在我调用它的地方放一个奇怪的输出.我该怎么办?
- 如果用户输入在整数变量中浮动怎么办?
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 当两个相等的双精度的相对比较不起作用时,我该怎么办?
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 如果我必须覆盖非虚拟成员函数怎么办
- 我正在"void value not ignored as it ought to be"我该怎么办?
- 当您的程序在进入主程序之前崩溃时该怎么办?
- 是否可以"unprivate" C++继承中的元素?如果没有怎么办?
- caffe 可以一次接收一批具有不同分辨率的输入吗?如果是这样,怎么办?
- 比率<,> 是恒定的,但如果我想接受不同的比率作为参数怎么办?
- 未定义的引用错误,我该怎么办?
- 如果我忽略返回类型shared_ptr函数的返回值怎么办
- 预计在GMock打电话,工厂返回unique_ptr
- 是否可以覆盖 "find" 和 "erase" boost::bimaps::bimap.left 的方法?怎么办?
- 免费/删除 - 如果我不打电话怎么办