动态分配的内存在进程结束后会被操作系统回收吗?

本文探讨了C++程序在操作系统层面如何进行内存回收。详细解释了进程结束后,操作系统如何回收进程占用的内存空间,包括虚拟地址空间的概念及其实现机制。

首先答案是:会。

这是当时在华为培训班的时候遇到的一个问题。很多同学本着C++没有内存回收的理论认为不会被回收。而我本着操作系统设计的时候就会考虑到这一点,所以大多数现代操作系统一定会回收。这是一个需求决定的机制,而不是由于语言的限制。但是有个持有错误观点的同学是清华的,我迫于学术崇拜,以及对自己实力的不自信,没有很好的坚持自己的观点,而是保留了疑问。

我是这样分析的:

1.操作系统是对于硬件的抽象。也就是说再没有操作系统的时候程序直接和机器打交道,而有了操作系统以后程序以为是很机器打交道,其实是在和操作系统打交道。程序申请的每一个操作系统的空间都是操作系统基于的虚拟地址。这也是在大三的时候我写的文章里面说程序自以为独占了机器,而操作系统是冥冥中的上帝之手。而确实是有很多的刻画小说吧人的梦境和白天的时间写成分时复用给不同的世界也是这个思路,扯远了。

2.一个进程结束以后,还保留着其内存空间,这样的机制是计算机用户不希望看到了,也没有什么用途。当然这里指的是用户级别的应用。所以操作系统不会设计成这个样子


后来通过我查资料发现

每一个进程都运行在一个独立的4GB“地址空间”当中 

这个4G只是逻辑上的,物理内存不可能有这么多,
这个“地址空间”中,内核占掉了高位的2G, 用户就用低位的2G 了,用malloc 来管理
在用户程序的堆中分配一个指定大小的空间,并告诉系统的内存管理模块:“我要使用这块空间!” 
那么,系统的内存管理模块究竟做了些什么呢?
熟悉Intel 80x86编程的人应该容易理解,它其实只做一件事:把应用程序的虚拟地址空间映射到真实的物理地址(或者磁盘上的分页文件) 
所以说,不管用户程序怎么malloc,在进程结束的时候,其虚拟地址空间就会被直接销毁,操作系统只需要在进程结束的时候
让内存管理模块把分页文件中与此进程相关的记录全部删除,标记为“可用空间”,
就可以使所有申请的内存都一次性地回收,根本没有什么麻烦.
简单说,malloc 的分配都是假的,malloc 的请求系统都知道,程序退出时,系统会回收malloc 的所有资源。
但是,有些内存系统是回收不了的。
例如运行于内核级的驱动造成的内存错误等, 这些是系统所管不了的。
这种错误,重启程序是没有效果的。必须重启电脑才能解决。
http://blog.youkuaiyun.com/hejinjing_tom_com/article/details/38561677
	后来通过查资料发现这个博主的文章更加详细,而且在理。
而我在遇到矛盾纠纷的时候就缺少这种稳定下来思维而后娓娓道来的素质。这是需要我提高的地方。
1.需要对理论知识足够的熟悉,并且经验中遇到过很多的问题。
2.拥有有道理讲道理,娓娓道来,绘声绘色,不喜不悲的素质。
3.增加自己的自信,很多时候心里总是依赖,其实在自己可以确定的地方是可以自信一下的,无论对方是谁。前提是按照前两点讲出你的道理。
### 动态内存分配与程序结束后的内存回收机制 动态内存分配是指程序在运行期间根据需要手动申请和释放内存的一种机制。在 C 语言中,通过 `malloc`、`calloc`、`realloc` 等函数申请内存,通过 `free` 函数释放内存[^2]。动态内存的生命周期不由函数调用决定,而是由程序员手动管理。如果程序员未显式调用 `free` 释放内存,则该内存不会在函数结束后自动释放,但程序结束后,操作系统通常会回收该程序占用的所有资源,包括未释放的动态内存[^4]。 #### 动态内存是否需要手动释放? 是的,动态内存需要程序员手动释放。原因如下: 1. **资源管理的精确性**:动态内存的释放依赖于程序员的显式操作,可以确保内存在不再使用时及时释放,避免程序运行期间的内存浪费。 2. **避免内存泄漏**:未手动释放动态内存会导致内存泄漏,即程序运行期间不断申请内存而不释放,最终可能导致内存耗尽。因此,即使程序结束操作系统回收内存,良好的编程实践仍然要求显式释放所有动态分配内存[^1]。 #### 为什么程序结束操作系统会自动回收内存? 程序结束后,操作系统回收该程序占用的所有资源,包括栈区、堆区和静态区的内存[^4]。这是因为操作系统为每个进程分配独立的虚拟地址空间,当进程终止时,这些地址空间会被操作系统统一回收,无论内存是否由程序员显式释放[^3]。 1. **栈区内存**:由编译器自动管理,在函数调用结束时自动释放。 2. **堆区内存**:通常由程序员手动释放,但在程序结束后,操作系统会统一回收所有未释放的堆内存[^2]。 3. **全局区和静态区**:用于存储全局变量和静态变量,其生命周期贯穿整个程序运行期间,程序结束后由操作系统回收。 #### 示例代码 以下是一个动态内存分配和释放的示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int *)malloc(10 * sizeof(int)); // 动态分配内存 if (ptr == NULL) { printf("Memory allocation failed.\n"); return 1; } for (int i = 0; i < 10; i++) { ptr[i] = i; } free(ptr); // 手动释放内存 return 0; } ``` 在此示例中,`malloc` 用于动态分配内存,`free` 用于显式释放内存。如果未调用 `free`,程序结束操作系统仍然会回收内存,但为了良好的编程实践,仍应显式释放内存。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马工匠坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值