在阅读this question的答案时,我注意到答案(例如this)意味着即使delete
语句在空指针上执行时也可以调用operator delete
。为什么当我在空指针上调用“delete”时调用“operator delete”?
所以我写了一个小片段:
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 2010-09-29 13:37:44
@ybungalobill:这很简单 - 标准要求返回的指针是有效的且不同的。 – sharptooth 2010-09-29 14:08:10
请注意,如果您使析构函数为虚拟,则不会调用重载'operator delete'。实现通常直接从析构函数调用该函数,并在不检查null的情况下调用析构函数(从而节省一些指令)。只有当呼叫需要虚拟调度时才是预先执行的检查。 – avakar 2010-09-29 14:11:10