C/C++动态内存分配

程序内存空间

  • 在一个程序的虚拟地址空间中,内存被分成了多个段,常见的有:代码段数据段堆空间栈空间
    • 一般来说栈空间位于虚拟地址空间的尾部,它的地址是”倒着长得“,即栈底大,栈顶小。
  • 我们在动态内存分配中使用的内存空间属于“堆空间”

C语言中的动态内存分配

  • 在C语言中,动态内存的分配与释放主要通过malloc函数和free函数。

malloc函数

  • malloc在C语言中并不属于关键字,它只是一个函数,使用前需要引入头文件。malloc函数的原型如下:
#include<stdlib.h>
void *malloc(size_t size);
  • 参数size代表需要动态申请的内存的字节数,若内存申请成功,函数返回申请到的内存的起始地址,若申请失败,返回NULL
  • 该函数一定是申请一块连续的区间,可能申请到内存比实际申请的大,但也有可能申请不到,若申请失败,则返回NULL。
  • 函数的返回值是void*,不是某种具体类型的指针,赋值前需要进行强制类型转换。
int *number = (int*)malloc(sizeof(int));

free函数

  • malloc函数一样,free也不属于C语言中的关键字,它只是一个函数,使用前需要引入头文件。函数原型如下:
#include <stdlib.h>
void free(void *ptr);
  • 函数的参数ptr,指的是需要释放的内存的起始地址。该函数没有返回值。
  • 调用该函数时,必须提供内存的起始地址,不能提供部分地址,释放内存中的一部分是不允许的。
  • 编译器不负责动态内存的释放,需要程序员显示释放。因此,mallocfree是配对使用的,避免内存泄漏。
  • 同一空间的重复释放是危险的,因为该空间可能已另分配。
  • free函数释放的是堆空间的内存,对其他段是无效的。
free(number);

C++中的动态内存分配(待完善)

  • 在C++中,可以使用new来动态申请内存,使用delete来动态释放内存。他们的作用机制要比C语言中的malloc/free复杂不少。

new

//分配内存,但未初始化
int * a = new int; 
//分配内存时,将 *a 初始化为 8
int * a = new int(8);
//分配了3个int大小的连续内存块,但未初始化
int * a = new int[3]; 

delete

delete a;//释放单个int的空间
delete []a;//释放int数组空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值