在C+终止时返回内存+;程序 当C++程序终止时,运行过程中使用的RAM被清理并返回系统,对吗?p>
问题1) 这个内存是由C++语言特性管理的还是由计算机硬件本身管理的? 问题2) 如果在Unix终端中使用在C+终止时返回内存+;程序 当C++程序终止时,运行过程中使用的RAM被清理并返回系统,对吗?p>,c++,memory,C++,Memory,问题1) 这个内存是由C++语言特性管理的还是由计算机硬件本身管理的? 问题2) 如果在Unix终端中使用ctrl+Z终止运行,内存是否高效/安全地返回 当C++程序终止时,运行过程中使用的RAM被清理并返回系统,正确? 对。我希望你说的系统是指操作系统 问题1)这个内存是由C++语言特性管理的还是由计算机硬件本身管理的?< /P> 返回的内存由操作系统管理(如果我正确理解了这个问题)。在返回操作系统之前,内存由进程管理;在底层,也就是说,由各种语言功能管理,如分配-释放机制、构造函数、析构函数
ctrl+Z
终止运行,内存是否高效/安全地返回
<>当C++程序终止时,运行过程中使用的RAM被清理并返回系统,正确?
对。我希望你说的系统是指操作系统
问题1)这个内存是由C++语言特性管理的还是由计算机硬件本身管理的?< /P> 返回的内存由操作系统管理(如果我正确理解了这个问题)。在返回操作系统之前,内存由进程管理;在底层,也就是说,由各种语言功能管理,如分配-释放机制、构造函数、析构函数等
问题2)如果在Unix终端中使用ctrl+Z终止运行,内存是否高效/安全地返回 Ctrl+Z将挂起该进程。它不会终止它。因此,只要进程没有终止,内存就不会返回到操作系统 在linux中,Ctrl+C终止进程,然后内存返回操作系统是由C++语言特性管理的内存还是由计算机硬件本身管理的?< /P> 这两种情况都会发生,假设正确关机(与撞车或死亡相比)。标准C/C++库通过操作系统系统调用释放它分配的任何(未泄漏的)内存,最终操作系统清除所有泄漏的内存
如果在Unix终端中使用ctrl+Z终止运行,内存是否高效/安全地返回 Ctrl-Z挂起Unix上的进程。如果使用kill或kill-9终止它,操作系统将(安全/高效地)回收内存Q:当C++程序终止时,运行时使用的RAM 已清洁并返回系统,对吗
A:对。这对于任何程序都是正确的,不管它是用什么语言编写的,也不管它是Linux、Windows还是其他操作系统 q是由C++语言特性管理的内存返回或由 计算机硬件本身 答:两者都不是:操作系统负责管理进程的内存 Q:如果我终止一个任务,内存是否能高效/安全地返回 在Unix终端中使用ctrl+Z运行 答:操作系统资源(如内存)被释放。但是,如果你不优雅地杀死一个程序,你可能会留下文件损坏、IPC锁定以及其他操作系统无法控制的坏东西 “希望有帮助他们说动态分配的内存只由程序员返回。例如,一个
myclass *obj = new myclass();
总是要有一个相应的
delete obj;
somwehere,否则您的程序将泄漏内存,这意味着操作系统可能认为内存的某些部分已被使用,而实际上它们并未被使用-在多次泄漏之后,您的内存可能会被错误内存完全耗尽,您将无法对其进行任何处理
然而,“C++”(实际上意味着“编译器”)负责在堆栈上分配的所有内容,如
myclass obj;
只要析构函数确实正确地删除了在该类中动态创建的任何内容
然而,在实践中,如果您泄漏内存,现代操作系统会处理它,并且通常会清理它。通常,在某些系统中,操作系统将能够识别您实际使用的内存部分,然后在应用程序终止后立即释放内存中的所有内容
内存泄漏通常只会在应用程序需要大量内存,需要不时正确释放一些内存时,或者在内存有限的系统(如控制台)上,在循环中(如游戏中)连续泄漏内存时,才会真正产生问题。Ctrl-Z通常不会终止进程。我在回答中提到,同样。还有鲜为人知的
kill-2
和kill-3
。内存将被回收,独立于终止方法。我不知道将运行RAM返回到OS的C++运行时。通常,一旦一个C++进程触摸了一个RAM页面,它就为进程的生命保留它。@ DeftHyg代码,我同意进程运行时所说的内容。但这并不妨碍stdlib在正常终止期间将所有内存页返回操作系统。我不确定是否是stdlib在关机期间返回内存。我认为是操作系统在进程退出后获取了所有内存,但我不是100%确定。一般来说,除非您通过mallopt()更改了行为,否则我认为我同意灵巧的代码,即stdlib不会返回内存。不过,我不能说我确实验证过这一点。@MichaelGoldshteyn:我的观点是stdlib不会将内存页返回到操作系统。这是可以做到的(我认为JVM是在压缩之后做到的)。操作系统在进程停止执行后回收内存页,stdlib与此无关。对不起,你说的“现代操作系统会处理它”是完全错误的。内存泄漏仍然是一个非常现实的陷阱。这就是为什么像Java运行时或.Net这样的垃圾收集环境如此流行的原因