动态内存管理

在C语言中,有malloc,calloc和realloc三个库函数来实现动态内存的开辟,而你知道它们三个的又有怎样的区别吗?

1.函数原型不同

  (1)malloc: void* malloc(size_t size);

  (2)calloc: void* calloc(size_t num, size_t size);

  (3)realloc:void *realloc(void* ptr, size_t size);

2.malloc只开辟内存,却不负责初始化开辟的这段内存的内容,而calloc同时既开辟内存,又进行初始化.

3.realloc是对已分配地址的指针重新分配空间.


在C++中,在保留C中的三个库函数之外,又有了新的一个操作符new/delete(new[]/delete[] arr),与其类似,那么此时的你是否会有疑惑,为什么有这三个函数,还要定义一个新的操作符?它们之间的联系和区别又是什么呢?

(1)它们都是动态管理内存的入口;

(2)malloc/free是C/C++标准库函数,new/delete是C++操作符;

(3)malloc/free只是分配/释放空间,而new/delete出了分配空间还会调用构造函数,析构函数进行初始化与清理;

(4)malloc/free需要手动计算类型大小且返回类型为void*,

        new/delete自己计算类型大小,返回类型对应指针类型。

列举了它们之间的区别和联系,你是否知道了为什么会有new/delete了嘛?

下面说下void * operator new 和operator delete:

注意:它们不是操作符的重载,不是操作符的重载,不是操作符的重载,重要的事情说三遍...

(1)它们值负责分配/释放空间,不进行调用构造/析构函数来初始化与清理;

(2)它们只是对malloc/free的封装。

这里new 做了两件事(1)调用operator new 分配空间(2)调用构造函数初始化

 delete也做了两件事(1)调用析构函数(2)调用operator delete释放空间。

                  new[N]:(1)调用operator new 分配空间(2)调用N次构造函数

               delete[] arr:(1)调用N次析构函数(2)调用operator delete。   

这里在释放一个数组空间时为什么不用传这个数组的大小而且还能准确释放呢?

这里需要用图来解释一下。

这里在给一个数组开辟内存时,已经在前面多开辟了一个空间p-1,内容N便表示的是数组的大小,在delete的时候N发挥了作用.


在最后附上一幅图解析new和delete时候的详细步骤


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值