C++和C语言动态内存管理的区别(malloc和new的区别)
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失败抛异常。