【发布时间】:2011-04-18 19:44:13
【问题描述】:
在阅读this question 的答案时,我注意到答案(例如this)暗示即使在delete 语句在空指针上执行时也可以调用operator delete。
于是我写了一个小sn-p:
class Test {
public:
void* operator new( size_t ) { /*doesn't matter*/ return 0; }
void operator delete( void* ptr ) {
ptr; //to suppress warning and have a line to put breakpoint on
}
};
int main()
{
Test* ptr = 0;
delete ptr;
}
而且——令我惊讶的是——Test::operator delete() 被调用时 ptr 持有一个空指针。
据我了解,operator new 分配内存,operator delete 将内存返回给分配器。如果我在空指针上调用 delete 语句,则意味着指针后面没有对象,也没有内存可以返回给分配器。
delete 语句包括调用析构函数。当我传递一个空指针时,肯定不会调用析构函数——C++ 会处理这个问题。那为什么在这种情况下会调用operator delete呢?
【问题讨论】:
-
还问为什么在分配零长度数组时会调用
operator new:new Test[0];... ;) -
@ybungalobill:这更容易 - 标准要求返回的指针有效且不同。
-
请注意,如果将析构函数设为虚拟,则不会调用重载
operator delete。实现通常直接从析构函数调用函数并调用析构函数而不检查空值(从而节省了一些指令)。只有当呼叫需要虚拟调度时,才会提前进行检查。 -
还有一点:从析构函数中调用操作符很方便,因为它节省了一次虚拟调度。
标签: c++ pointers memory-management