C与C++动态内存管理

c的动态内存管理使用的是malloc,calloc,realloc与free这几个函数:

malloc的作用是开辟空间;

calloc的作用是开辟空间并且对空间进行类型默认值的初始化;

realloc的作用是对以及开辟好的空间进行扩容

free的作用是对释放掉开辟的空间

malloc,calloc,realloc的返回值为一个无类型的指针(void*)  ,  所以在使用malloc进行动态内存开辟的时候就必须加上强转,比如:

char* s = (char*)malloc(sizeof(char)*4);

char* t = (char*)calloc(4,sizeof(char));

char* s = (char*)realloc(s,sizeof(char)*8);

malloc函数的参数是需要开辟的字节数,上条代码给s开辟了4个char类型大小的空间。

给t开辟了四个char类型的空间并且对其初始化;

并且对s又扩容到了8个char类型大小的空间。

而使用完动态开辟的空间后,就要对其进行释放。释放开辟的空间,直接使用free就好

free(s);

如果free得到的参数为NULL;那么它将不会有任何操作。

但是如果将s这个指针free掉之后再次进行free,系统就会报错了,因为s的指向依然是之前自己开辟的空间,但是那个空间已经被释放掉了,对释放的空间再次进行释放,就不合理了。所以在释放完开辟的空间后,一定要及时将指针赋值为NULL

free(t);
t = NULL;

那么对开辟的空间进行操作的时候,会进行好几次的realloc,free是如何知道要释放多大的内存呢?


int* p = (int*)malloc(sizeof(int)*5);

int* p = (int*)realloc(p,sizeof(int)*10);

free(p);

其实在开辟内存的时候,系统会在开辟的首地址前多申请一块内存空间,这称为header或者头块;

header里面保存着一些信息,其中就包括这段程序设计人员所申请的连续空间的大小等等

 realloc的原理就是,如果后面有足够的内存,就原地扩容,如果没有,就在别的地方申请好需要的空间,再把第一次malloc中空间的数据按位拷贝到新内存中,再返回新内存的地址。

这三个函数如果申请失败返回值都是NULL

C++的动态内存管理使用的是俩个运算符new  与delete

这和c语言不一样,new和delete是运算符,意味着它可以进行重载。

int* n = new int[4] {1,2,3,4};

delete[]n;

char* s = new char();

delete s;

可以看到,与malloc不同,首先不需要强转,其次,new可以在开辟空间屎对内存进行初始化。如果开辟的是一段连续的空间,那么delete的时候后面就加上[ ]来告诉编译器,需要释放一连串的空间。

delete与free相似;释放完之后一定要及时将指针赋值为空(nullptr);

关于new运算符其实还有定位的作用,这里不做讲解。

new如果申请空间失败之后,会抛出一个异常,而malloc等函数失败后会返回空值。

new在使用的时候不需要强转

new和delete是运算符,可以进行重载。malloc等等是函数

new在申请的时候就可以初始化,malloc等函数不行。

以上就是c/c++动态内存开辟的方法以及使用

感谢观看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

g162512

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

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

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

打赏作者

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

抵扣说明:

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

余额充值