最核心的区别
new/delete(相比于malloc/free)能够调用构造、析构函数。
原理
new/delete的过程均分为两步:
new operator = operator new + construtor
delete operator= destructor + operator delete
过程 | new/delete | malloc/free | |
---|---|---|---|
申请空间 | new operator | operator new | malloc |
调用构造函数 | construcor | x | |
- | - | - | - |
调用析构函数 | delete operator | destrucor | x |
释放空间 | operator delete | free |
注意其中new operator和operator new的区别:
new operator是指关键字new,不可重载
operator new是指操作符new,可重载。
// new operator
string* ptr = new string("Hello"); // new为new operator
// operator new
// 申请指定大小的空间,返回空间首地址的指针
void* operator new(size_t size); // operator new的声明形式
汇编
通过汇编语句可以看出这一过程:
1. 00A55B7A call operator new (0A51113h)
2. 00A55B97 call A::A (0A5140Bh)
// A* a_ptr = new A;
00A55B78 push 4
00A55B7A call operator new (0A51113h)
00A55B7F add esp,4
00A55B82 mov dword ptr [ebp-0F8h],eax
00A55B88 cmp dword ptr [ebp-0F8h],0
00A55B8F je main+54h (0A55BA4h)
00A55B91 mov ecx,dword ptr [ebp-0F8h]
00A55B97 call A::A (0A5140Bh)
00A55B9C mov dword ptr [ebp-13Ch],eax
00A55BA2 jmp main+5Eh (0A55BAEh)
00A55BA4 mov dword ptr [ebp-13Ch],0
00A55BAE mov eax,dword ptr [ebp-13Ch]
00A55BB4 mov dword ptr [a_ptr],eax
扩展
如何限制不在堆(heap)上生成对象?
答案右滑>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>将operator new私有化
参考
- 《More Effective C++》 条款8:了解不同意义的new和delete