C和Cpp里面的动态内存管理

c动态内存管理

c语言里面的动态内存管理函数,介绍的有4个,分别是malloc,
realloc,calloc,和free,其函数原型分别如下

void *malloc(size_t size);
void *calloc(size_t num_elements,size_t element_size);
void realloc(void ptr,size_t new_size);
void free(void* pointer);

malloc函数是在堆空间上开辟一块合适的空间,并且返回一个指向这块内存的指针,这块开辟的空间没有进行任何方式的初始化,如果需要初始化,必须自己手动初始化。

calloc函数也是在堆空间上开辟一块合适的空间,并且返回一个指向这块内存的指针,但是,在返回指针之前,这块空间已经自动初始化为0了。不用自己在初始化,这是malloc 和calloc 最大的区别。

realloc函数是调整开辟的空间的大小,如果空间开辟小了,realloc函数会在开辟的一块空间,将新开辟的空间添加到原来空间的后面,新空间没有初始化,当然原来空间内容依然保留,如果空间不够开辟,realloc将分配另一块正确大小的空间,并把原来那块内存的内容复制到新的空间里,并且销毁原来那块空间,当然指针指向新的那块空间,如果空间开辟大了,空间尾部被拿掉,剩余部分的原先内容依然保留。

free函数是释放开辟的内存,接受的是指向内存的指针,
free的时候要注意,

> 同一块空间不能free两次,

>free不能只free空间的一部分

>不能不free

> free完,要将指针置空

> malloc和free要成对出现

cpp动态内存管理

cpp提供new和delete标识符(不是函数),来实现动态内存管理;
有两种形式
int *p1 = new int ;
delete p1;
int *p2 = new int[10];
delete[]p2;

在自定义类型中,例如类中,new办了两件事

> 1,开辟堆空间
> 2,调用构造函数

当然delete也办了两件事,

> 调用析构函数
> 回收堆空间

内置类型中,new delete和malloc 和free 是一样的

当然cpp中也提供了库函数operator new()和opreator delete()
来管理内存。
只不过这两者是new和delete的底层代码,使用new的时候会调用operator new,operator new会调用operator new[],operator[]会调用malloc,而delete会调用opreator delete[] ,operator[] 会调用free,最后还是回到了 malloc 和free上面,
因此,只要你理解了这层关系,你可以不用匹配写new和delete ,但是对于初学者来说,一定要匹配写,否则很容易弄错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值