内存空间布局

内存空间布局 🥱🙄😶😑😐

  • 每个引用都有自己独立的内存空间,一般分为一下几个区域
    |空间名称| 栈空间 | 堆空间 | 代码区 | 全局区 |
    | -- | -- | -- | -- | -- |
    |作用| 调用函数就需要分配连续栈空间 | 主动申请和释放 | 存放函数的位置(只读)用于存放代码 | 全局变量等 也被称作数据段 |
    | 回收| 调用完毕自动回收 由计算机控制回收 | 玩家手动控制回收(delete) | | 程序寄了的时候才会回收 |

堆空间

  • 自由控制内存的生命周期、大小
  • 操作方法

1.malloc申请空间[void* malloc(size_t Size)]

  • 它会返会第一个字节的地址
int main(){

int *p = (int *)malloc(4);
*p = 44444;//这就完成了在堆空间存储的操作
return 0;
}

但是操作完成后其并不会自动回收
我们只需要在刚才代码的基础上增加

int main(){

int *p = (int *)malloc(4);
*p = 44444;
free(p);//将堆空间的地址丢进去他就会回收掉使用的堆空间
return 0;
}

同样

int main(){

char *p = (char *)malloc(4);
*p = 10 ;//它指向的是分配的第一个字节也是仅写入第一个字节
//我们也可以按照类型大小来分配
p[0]=1;
p[1]=1;
p[2]=1;
p[3]=1;
//也可以用这种方法
*(p+0) = 10 ;
*(p+1) = 10 ;
*(p+2) = 10 ;
*(p+3) = 10 ;

free(p);//依然全部释放 
return 0;
}

在执行以下语句时

char *p = (char *)malloc(4);

涉及到栈空间的申请(p)和堆空间的申请
当函数执行完毕后,我们的(p)会被释放,如果不手动释放堆空间可能会出现未知的错误 比如说内存泄漏,因为里面有之前保留的数据

new/delete 与 new[]/delete[]

int main() {
   int haha;
   std::cin >> haha;
   int* p = new int;//创建空间
   int* pr = new int[haha];
   delete[] pr;
   delete p;
}

注意 malloc/free 和 new/deletet 和new[]/delete[]

这三个东西应该成对使用不能混用
-delete是释放一个对应大小空间,而对于数组应当用delete[] 全部释放

posted @ 2024-03-12 12:00  dxwxb  阅读(29)  评论(0)    收藏  举报