我们知道在C语言中用malloc,realloc,calloc在堆上开辟空间,然后用free来释放空间。使用_alloca在栈上动态开辟内存,栈上开辟的内存由编译器启动维护,不需要用户显示释放。
1、在C++中也有动态内存开辟,利用了new和delete,下边我们了解一下:
int main()
{
//动态分配4个字节的空间单个数据
int* p1 = new int;
//动态分配四个字节的空间并初始化为3
int* p2 = new int(3);
//动态分配12个字节的空间
int* p3 = new int[2];
//底层实现还是用free实现
delete p1;
delete p2;
//必须和new[]配套使用否则会出现内存泄漏
delete[] p3;
return 0;
}
注意:
new和delete / new[ ]和delete[ ] 一定要匹配使用!!!一定要匹配使用!!!一定要匹配使用!!!(重要的事情说三遍)
否则会造成内存泄漏,后果很严重!!
2、new和delete的调用过程
new的调用过程:new ---->operator new ----> malloc
new是malloc的封装
delete的调用过程: delete --->operator delete --->free
delete是free的封装
3、malloc/free和new/delete大的区别和联系:
他们都是动态管理内存的入口
malloc/free是C/C++标准库函数。new/delete是C++的操作符
malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理(清理成员)
malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型大小,返回对应类型的指针
以上就是动态内存管理 new和delete的全部内容,想了解更多请关注学步园。