C++和C语言动态内存管理的区别(malloc和new的区别)

C语言的动态内存管理在之前的一篇博客中有提到过:C语言动态内存管理
学了C语言的动态内存管理,C++中同样的也有动态内存管理,那这二者之间到底有何区别呢???

C语言动态内存管理
通过malloc、realloc、calloc以及free函数来动态开辟/释放空间。

#include<stdlib.h>

void* malloc (size_t size);
//1、这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 
//2、如果开辟成功,则返回一个指向开辟好空间的指针。 
//3、如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
//4、 返回值的类型是void * 。所以malloc函数并不知道开辟空间的类型,
//具体在使用的时候使用者自己来决定。 
//5、如果参数为0,malloc的行为是标准是未定义的,取决于编译器。

void *calloc(size_t num,size_t size);
//1、函数的功能是为num个大小为size的元素开辟一块空间,
//并且把空间的每个字节初始化为0。 
//2、与malloc函数的区别只在于会在返回地址之前
//把申请的空间的每个字节初始化为0。

void* realloc (void* ptr, size_t size);
//1、ptr 是要调整的内存地址 
//2、size 调整之后新⼤大⼩小 返回值为调整之后的内存起始位置。 
//3、这个函数调整原内存空间大小的基础上,
//还会将原来内存中的数据移动到新的空间 
//4、realloc在调整内存空间的是存在两种情况: 
//情况1:原有空间之后有足够大的空间 
//要扩展内存就直接在原有内存之后直接追加空间,
//原来空间的数据不不发生变化。
//情况2:原有空间之后没有足够大的空间
//原有空间之后没有足够多的空间时,扩展的方法是:
//在堆空间上另找一个合 适大小的连续空间来使用。
//这样函数返回的是一个新的内存地址。 

void free (void *ptr);
//1、 free函数用来释放动态开辟的内存。 
//2、如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。 
//3、如果参数是NULL指针,则函数什么事都不做。

C++动态内存管理
通过new/delete、new [ ]/delete [ ]操作符来进行的动态内存管理。

new / delete:动态管理对象。

new:先调用operator new分配空间,再调用构造函数初始化空间。
delete:先调用析构函数清理对象,再调用operator delete释放空间。

new[] / delete[]:动态管理对象数组。

new[n]:调用operator new分配空间,再调用n次构造函数初始化对象。
delete[n]:调用n次析构函数清理对象,再调用operator delete释放空间。

int* ptr1=new int;//动态分配4个字节的空间
delete ptr1;
int* ptr2=new int(4);//动态内存分配4个字节空间并初始化为4
delete ptr2;
int* ptr3=new int[4];//动态内存分配16个字节空间(对象数组)
delete[];

总结:C语言和C++动态内存管理的区别

1、它们都是动态管理内存的入口
2、new/delete是C++操作符,malloc/free是C/C++准库函数
3、malloc/free只是动态分配内存空间/释放空间,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)
4、malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型大小,返回对应类型指针
5、malloc/free失败返回0, new/delete失败抛异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值