在阅读这个问题的答案时,我注意到答案(例如这个)暗示即使在空指针上执行
因此,我编写了以下简短代码片段:
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;
}
令我惊讶的是,使用空指针ptr
时会调用Test::operator delete()
。
据我所知,operator new
用于分配内存,operator delete
将内存返回给分配器。如果我在空指针上调用delete
语句,这意味着指针后面没有对象,并且没有内存可以返回给分配器。
delete
语句包括调用析构函数。当我传递一个空指针时,析构函数肯定不会被调用 - C ++会处理这个问题。那么为什么在这种情况下调用operator delete
呢?
operator new
函数:new Test[0];
... ;) - Yakov Galkaoperator delete
将不会被调用。实现通常会直接从析构函数中调用该函数,并在调用析构函数时不进行空指针检查(从而节省一些指令)。只有在需要进行虚拟分派时才会提前执行检查。 - avakar