**
##干货: c与c++中的动态内存深度剖析
一点整理,希望对你有帮助。。。
c语言中分为在堆或者栈中进行动态内存管理,首先堆上开辟空间通常使用malloc/calloc/realloc三个函数,使用free将申请的空间释放掉。
三个函数返回值均为void*,三个函数区别在于其参数不同,如下:
p=(in*)malloc(sizeof(int));//字节数
p = (int*) calloc (n,sizeof(int));//元素个数,字节数且元素初始化为0
p= (int*)realloc(ptr,sizeof(int));//指针,字节数,指针为空则malloc,非空则扩容。
注意:使用malloc/calloc/realloc则必须使用free来释放内存,否则会造成内存泄漏。
其次,在栈上使用_alloca动态内存开辟,栈上内存由编译器自动维护,不需要用户显示释放 。
c++中包容了C中原有的管理方式,也提出了自己的内存管理方式:new和delete运算符。
注意:new和delete不是函数,是操作符。
// 动态申请一个int类型的空间
int* ptr1 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr2 = new int(10);
// 动态申请10个int类型的空间
int* ptr3 = new int[3];
new与delete的剖析:
new()–>operator new()–>malloc()–>构造函数–>return ptr
//new操作符通过调用operator new()函数进行申请空间与初始化,operator new()先调用malloc函数申请空间,再调用构造函数初始化对象,本质上operator new()是malloc()的封装
与其对应的使delete(),注意的使new和delete一定是搭配使用的,delete()则负责释放空间清理对象
delete()–>析构函数–>operator delete()->free()
//operator delete()则显然是free()的封装,operator delete()先调用析构函数进行清理工作,再调用free()释放空间
new[count]和delete[count]:
申请count大小的数组空间与清除,也就是在new()时调用count次的构造函数,在delete()时调用count次的析构函数,其核心本质和new /delete是相同的