当一个包含动态分配内存(使用malloc/new)而没有free/delete调用的C/C++程序被终止时,动态分配的内存会发生什么变化?操作系统会收回这些内存,还是其他程序无法访问这些内存?
lnlaulya1#
我不认为在语言标准中有任何保证,但是支持稀疏虚拟内存和内存保护的现代操作系统(如MacOS X、Linux、所有最新版本的Windows和所有当前生产的手机)会自动清理行为不良的进程(当它们终止时)并为您释放内存。内存仍然不可用,但只要程序在运行。如果您在微控制器、MacOS 9或更早版本、DOS或Windows 3.x上编程,那么您可能需要担心内存泄漏,从而导致内存对整个操作系统永久不可用。
zour9fqk2#
大多数现代操作系统都使用内存管理器,所有用户级进程只能看到所谓的“虚拟”内存,而虚拟内存与实际系统内存没有任何关系,程序无法检查。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着内存管理器将在进程终止时完全“释放”分配给该进程的所有内存。因此程序内的内存泄漏通常不会“影响”系统的其余部分(除了可能强制大量磁盘交换和可能的一些“内存不足”行为之外)。这并不意味着可以轻松地处理内存泄漏问题,它只是意味着在现代多任务操作系统上,没有一个程序可以随意地破坏其他进程(当然,尽管存在故意滥用管理权限的情况)。
bvjxkvbb3#
简短回答:是的,操作系统将释放此内存。大多数操作系统会释放此内存,但是依赖此行为是不好的做法。有些操作系统不会释放此内存。例如,嵌入式系统。为了便于移植,请始终释放所有分配的内存。
svdrlsy44#
C/C++没有垃圾回收功能。如果你分配了内存而不释放它,那么在程序继续执行的时候,它就没有用了。这叫做内存泄漏。一旦执行完成,操作系统就会收回这些内存并再次使用。
qmb5sa225#
在程序执行期间,你不能指望操作回收内存。这是许多其他语言(如Java和C#)中的垃圾收集功能。虽然垃圾收集c++是可能的,但我不相信任何主流实现都使用它。另一方面,一旦程序执行完毕,操作系统就应该回收程序使用的内存,所以在执行过程中,内存仍然是禁止访问的,但在程序退出后,内存又可以访问了。
5条答案
按热度按时间lnlaulya1#
我不认为在语言标准中有任何保证,但是支持稀疏虚拟内存和内存保护的现代操作系统(如MacOS X、Linux、所有最新版本的Windows和所有当前生产的手机)会自动清理行为不良的进程(当它们终止时)并为您释放内存。内存仍然不可用,但只要程序在运行。
如果您在微控制器、MacOS 9或更早版本、DOS或Windows 3.x上编程,那么您可能需要担心内存泄漏,从而导致内存对整个操作系统永久不可用。
zour9fqk2#
大多数现代操作系统都使用内存管理器,所有用户级进程只能看到所谓的“虚拟”内存,而虚拟内存与实际系统内存没有任何关系,程序无法检查。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着内存管理器将在进程终止时完全“释放”分配给该进程的所有内存。因此程序内的内存泄漏通常不会“影响”系统的其余部分(除了可能强制大量磁盘交换和可能的一些“内存不足”行为之外)。
这并不意味着可以轻松地处理内存泄漏问题,它只是意味着在现代多任务操作系统上,没有一个程序可以随意地破坏其他进程(当然,尽管存在故意滥用管理权限的情况)。
bvjxkvbb3#
简短回答:是的,操作系统将释放此内存。
大多数操作系统会释放此内存,但是依赖此行为是不好的做法。有些操作系统不会释放此内存。例如,嵌入式系统。为了便于移植,请始终释放所有分配的内存。
svdrlsy44#
C/C++没有垃圾回收功能。如果你分配了内存而不释放它,那么在程序继续执行的时候,它就没有用了。这叫做内存泄漏。一旦执行完成,操作系统就会收回这些内存并再次使用。
qmb5sa225#
在程序执行期间,你不能指望操作回收内存。这是许多其他语言(如Java和C#)中的垃圾收集功能。虽然垃圾收集c++是可能的,但我不相信任何主流实现都使用它。
另一方面,一旦程序执行完毕,操作系统就应该回收程序使用的内存,所以在执行过程中,内存仍然是禁止访问的,但在程序退出后,内存又可以访问了。