1. mallco和free
在C++中malloc和free仍然可以正常使用,但是对于自定义类的类型,不会进行初始化。
#include <iostream>
using namespace std;
class A
{
public:
int getVal() {return _a;}
private:
int _a;
};
int main()
{
A* p1 = (A*)malloc(sizeof(A));
cout << (*p1).getVal() << endl;
free(p1);
return 0;
}
2. operator new和operator delete
operator new底层调用的还是malloc函数,但是当内存分配失败的时候,会抛出异常。opeartor delete和free函数一样。
#include <iostream>
using namespace std;
class A
{
private:
int _a;
};
int main()
{
size_t size = 16;
try
{
A* p = (A*)operator new(1024*1024*1024*size);
cout << p << endl;
operator delete(p);
}
catch(const std::exception& e)
{
std::cerr << e.what() << '\n';
}
return 0;
}
3. new和delete
new在底层会调用operator new函数,同时对于给自定义类类型的内存空间分配时,会调用默认的构造函数。delete在底层会调用operator delete函数,对于自定义类类型的内存空间释放时,会调用析构函数。
#include <iostream>
using namespace std;
class A
{
public:
A()
{cout << "A()" << endl;}
~A()
{cout << "~A()" << endl;}
private:
int _a;
};
int main()
{
A* p = new A;
delete p;
return 0;
}
4. 总结
特性 | malloc/free | operator new/delete | new/delete |
---|---|---|---|
是否调用构造/析构 | ❌ 否 | ❌ 否 | ✅ 是 |
内存不足行为 | 返回 NULL | 抛出 std::bad_alloc | 抛出 std::bad_alloc |
类型安全 | ❌ 需强制转换 | ❌ 返回 void* | ✅ 自动类型匹配 |
内存大小计算 | 需手动 sizeof | 需手动 sizeof | 自动计算 |
可重载性 | ❌ 不可 | ✅ 可重载全局或类专属 | 通过重载 operator new |
初始化内存 | ❌ 不初始化 | ❌ 不初始化 | 调用构造函数初始化 |