【发布时间】:2017-04-19 19:03:10
【问题描述】:
在stackoverflow上搜索后,我发现:“检查仍然是操作符delete(或delete[])的责任;标准不保证它不会被赋予空指针;标准要求如果给定一个空指针,它就是一个空操作。“(delete a NULL pointer does not call overloaded delete when destructor is written) 现在我的问题是,有什么方法可以强制编译器生成实际调用重载/替换的 delete[](for 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 )
【问题讨论】:
-
是的,您应该能够覆盖全局
new/delete。delete运算符接受nullptr以与通常的free语义兼容。不清楚你为什么要检查它是否通过了 nullptr。 -
@VTT 我该怎么做?
-
您发布的 sn-p 应该可以工作。
-
不行,你自己试试吧。
-
也许你的编译器正在优化最后一个
delete?
标签: c++