【问题标题】:Using overloaded/replaced delete[] on nullptr在 nullptr 上使用重载/替换的 delete[]
【发布时间】: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 / deletedelete 运算符接受 nullptr 以与通常的 free 语义兼容。不清楚你为什么要检查它是否通过了 nullptr。
  • @VTT 我该怎么做?
  • 您发布的 sn-p 应该可以工作。
  • 不行,你自己试试吧。
  • 也许你的编译器正在优化最后一个delete

标签: c++


【解决方案1】:

标准未指定此行为。

C++11,§5.3.5,第 7 项:

如果删除表达式的操作数的值不为空 指针值,删除表达式将调用释放函数 (3.7.4.2)。否则,未指定是否释放 函数将被调用。

C++14为非空指针的情况增加了一些细节,但空的情况是一样的。

如果有任何方法可以强制执行任何特定行为,那就是编译器扩展。

【讨论】:

  • 不是我所希望的,但很好。
猜你喜欢
  • 2013-12-28
  • 2015-01-08
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多