首先贴一段MFC的源代码:
void __cdecl operator delete(void* p)
{
free(p);
}
void __cdecl operator delete[](void* p)
{
::operator delete(p);
}
然后贴一点汇编:
分析:
其中的call operator delete (4051C1h) 就是去调用MFC的void __cdecl operator delete(void* p)
其中的call operator delete[] (4051CBh) 就是去调用MFC的void __cdecl operator delete[](void* p)
所以在这种情下,两者是完全等效的。
分析:
其中的call A::`scalar deleting destructor' (402EA0h) 会call A::~A (402E00h) 然后call operator delete (4051C1h)
其中的call A::`vector deleting destructor' (402E20h)会循环的为每个对象call `eh vector destructor iterator' (443C7Dh) 循环结束之后call operator delete[] (4051CBh)
结论:
1,对于char这样的基础数据类型,delete和delete[]是等价的。
2,对于class A这样带析构函数的类型,delete和delete[]是不同的。
3,如果只有一个对象,那么对象数组在逻辑上可以蜕化成一个对象,但是那样会多一些步骤,性能会稍差一些。这大概是C++需要同时保留delete和delete[]的原因。