在stackoverflow上搜索后,我发现:"它仍然是操作员删除(或删除[])的响应性检查;标准并不能保证它不会被赋予空指针;如果给出空指针,标准要求它是无操作。 "(delete a NULL pointer does not call overloaded delete when destructor is written) 现在我的问题是,有没有办法强制编译器生成实际调用重载/替换delete [](对于nullptr)的代码,例如:
void *operator new[] (size_t n)
{
std::cout << "new works ";
return std::malloc (n);
}
void operator delete [] ( void* ptr) {
if(!ptr) {
std::cout << "you just tried to delete a nullptr";
return;
}
else {
std::cout << "delete works";
free(ptr);
}
}
int main(){
char *p(new char[5]);
char *q = nullptr;
delete[] p;
delete[] q;
return 0;
}
像这样产生输出:
new works delete works
我尝试用-O0编译它,但这似乎没有改变任何东西(附加信息:g ++ --version g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609 )
答案 0 :(得分:1)
该标准未指定此行为。
C ++ 11,§5.3.5,第7项:
如果delete-expression的操作数值不为null 指针值,delete-expression将调用deallocation函数 (3.7.4.2)。否则,是否取消分配是未指定的 函数将被调用。
C ++ 14为非空指针的情况添加了一些细节,但是null的情况是相同的。
如果有任何方法可以强制执行任何特定行为,那么它将是编译器扩展。