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失败抛异常。

猜你喜欢

转载自blog.csdn.net/qq_40927789/article/details/81775894