在C ++程序终止时返回内存

时间:2011-09-23 17:10:51

标签: c++ memory

当C ++程序终止时,运行期间使用的RAM会被清理并返回给系统,对吗?

问题1) 此内存是由C ++语言功能还是由计算机硬件本身返回管理的?

问题2) 如果我在Unix终端中使用ctrl+Z终止运行,是否有效/安全地返回内存?

5 个答案:

答案 0 :(得分:7)

  

当C ++程序终止时,运行期间使用的RAM会被清理并返回给系统,对吗?

正确。按系统,我希望你的意思是,操作系统。

  

问题1)此内存是否由C ++语言功能或计算机硬件本身返回托管

返回的内存由操作系统 管理(如果我正确理解了这个问题)。在返回操作系统之前,内存由进程管理;在低级别,这意味着,由各种语言功能管理,如分配 - 解除分配机制,构造函数,析构函数,RAII等。

  

问题2)如果在Unix终端中使用ctrl + Z终止运行,是否有效/安全地返回内存?

Ctrl + Z 暂停进程。它不会终止它。因此,只要进程没有终止,内存就不会返回给操作系统。

在linux中,Ctrl + C终止进程,然后内存返回操作系统。

答案 1 :(得分:5)

  1. 通常两者都有。至少假设正常终止,析构函数将运行,这通常会释放与这些对象相关联的内存。程序退出后,操作系统将释放该进程拥有的所有内存。

  2. 强制终止通常不会运行析构函数等,但任何合理的操作系统都会在进程终止后进行清理,无论它是否干净利落。但是有一些限制,所以如果你使用像锁文件这样的东西,它可能无法清理它们。

答案 2 :(得分:3)

  

问:当C ++程序终止时,运行期间使用的RAM会得到   清理并返回系统,对吗?

答:正确。对于任何程序都是如此,无论它是用什么语言编写的,无论是Linux,Windows还是其他操作系统

  

问:此内存是由C ++语言功能还是由   计算机硬件本身?

答:两者都没有:操作系统负责管理进程的内存。

  

问:如果我终止了,内存是否会有效/安全地返回   在Unix终端中使用ctrl + Z运行?

答:OS资源(如内存)被释放。但是,如果你毫无顾忌地杀死程序,你可以让文件损坏,IPC被锁定,以及其他超出操作系统控制范围的坏事。

'希望有所帮助

答案 3 :(得分:2)

  

此内存是由C ++语言功能还是由计算机硬件本身返回管理?

两者都发生,假设正确关闭(相对于崩溃或杀死)。标准C / C ++库解除分配通过OS系统调用分配的任何(非泄漏)内存,最终操作系统清除任何泄漏的内存。

  

如果我在Unix终端中使用ctrl + Z终止运行,是否有效/安全地返回内存?

Ctrl-Z在Unix上挂起进程。如果使用kill或kill -9终止它,则操作系统将回收(安全/高效)内存。

答案 4 :(得分:-1)

他们说动态分配的内存只能由程序员返回。例如,

myclass *obj = new myclass();

总是要有相应的

delete obj;
somwehere,否则你的程序会泄漏内存,这意味着操作系统可能会认为内存的某些部分被使用,而事实上它们不是 - 在太多泄漏之后你的内存可能被虚假内存完全耗尽而你赢了

。无法用它做任何事情。

但是,“C ++”(实际上意思是“编译器”)负责处理您在堆栈上分配的所有内容,例如

myclass obj;

只要您的析构函数实际上正确删除了您在该类中动态创建的任何内容。

然而,在实践中,如果您泄漏内存,现代操作系统将负责并通常清理它。通常有一些系统可以让操作系统能够识别您实际使用的内存部分,然后在应用程序终止后立即释放其中的所有内容。

内存泄漏通常只会在您的应用程序需要大量内存时才会真正产生问题,这些内存需要不时正确地释放一些内存,或者在内存中持续泄漏内存(如游戏中),内存有限的系统上(比如游戏机)。