程序进程结束会自动回收动态分配的空间吗?

作者:Rem ㅤ | 发布时间:

在使用c语言或者c++语言动态分配空间后都需要手动的对空间进行释放,那么如果没有手动的释放,在程序结束后系统会自动回收空间吗?我们做一个小的程序验证一下。

定义一个动态数组并初始化,然后分别在释放空间前后查看一下数组的内容:

 #include <iostream>
 using namespace std;
 
 int main()
 {
     int *t = new int[10];
     for (int i = 0; i < 10; i++)
         t[i] = i + 1;
     cout << *t << endl; //首位数据
     cout << &t << endl; // t的地址
     delete[] t;         // 删除t
     cout << *t << endl; //删除后的数据
 
     system("pause");
     return 0;
 }

结果:

image-20220731110819947

可以看到释放空间后数组的第一个元素的值不再是1.

使用CLion查看内存数据变化:

在执行delete语句前:

image-20220731140029157

执行后:

image-20220731140054679

可以看到执行delete后同一内存空间数据变为乱码。

下面删除delete语句:

 #include <iostream>
 using namespace std;
 
 int main()
 {
     int *t = new int[10];
     for (int i = 0; i < 10; i++)
         t[i] = i + 1;
     cout << *t << endl; //首位数据
     cout << &t << endl; // t的地址
 //   delete[] t;         // 删除t
 //   cout << *t << endl; //删除后的数据
 
     return 0;
 }

执行结果:

image-20220731142332037

查看0X61ff08地址内容:

     cout<<*((int *)0x61ff08)<<endl;

结果:

image-20220731142114175

有符号整数在内存中是以补码的形式存放,查看6422356的二进制:

image-20220731142542657

由于正数的原码、反码、补码都是整数本身,所以可以看出此结果并不是1的补码。

由此可以证明在程序的进程结束之后程序所申请的空间会被系统自动回收。

但是有许多程序的运行是具有持续性的以及交互性的,在申请了空间后还是要及时显式手动释放,以防止内存爆满。

标签:学习笔记, c/c++