前言
在C语言中,通过malloc申请堆内存,free释放堆内存。在C++中,也可以通过C语言的方式申请堆内存并释放堆内存,还可以通过new申请堆内存delete释放堆内存。
一、malloc和free
int* p = (int*)malloc(sizeof(int));
free(p);
通过malloc申请堆内存需要传入内存的大小(单位为字节)
通过free释放内存需要传入指向堆内存的指针
二、new和delete
申请单个元素内存:
int* p1 = new int;
delete p1;
申请内存数组:
int* p1 = new int[4];
delete[] p1;
对于C语言来说,没有内存数组之分,单个元素内存和内存数组都可以通过malloc申请,free释放
对于C++来说,申请单个元素内存需要通过new '类型’申请,通过delete释放,申请内存数组需要通过new ‘类型’[‘元素个数’]申请,通过delete[]释放
二、malloc/free和new/delete的区别
1、malloc/free是函数,new/delete是运算符
2、malloc申请堆内存失败会返回一个空指针,new申请堆内存失败会抛出bad_alloc异常
malloc返回空指针:
int* p = (int*)malloc(sizeof(int));
if (p == nullptr)
{
cout << "申请内存失败" << endl;
return -1;
}
free(p);
new抛出bad_alloc异常:
int* p1 = nullptr;
try
{
p1 = new int[4];
}
catch (const bad_alloc& e)
{
cout << "申请内存失败" << endl;
return -1;
}
delete[] p1;
3、malloc和free成对使用,new和delete成对使用,new[]和delete[]成对使用
总结
new/delete是运算符,在C++中,运算符是可以重载的。如果你需要用自己的一套策略去管理堆内存,可以考虑重载new/delete的运算符,实现对象池。malloc申请堆内存失败返回空指针,new申请堆内存失败抛出bad_alloc异常,在实际开发中需要注意下。
C/C++内存管理:malloc/free与new/delete对比解析
本文详细介绍了C语言中的malloc和free以及C++中的new和delete在内存管理上的使用和区别。malloc/free是函数,new/delete是运算符,malloc失败返回空指针,new失败则抛出异常。此外,C++中new和delete有对应的数组操作形式,而malloc/free没有区分。在实际开发中,理解这些差异对避免内存泄漏和程序崩溃至关重要。
7508

被折叠的 条评论
为什么被折叠?



