在nullptr上使用重载/替换delete []

时间:2017-04-19 19:03:11

标签: c++

在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 )

1 个答案:

答案 0 :(得分:1)

该标准未指定此行为。

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

  

如果delete-expression的操作数值不为null   指针值,delete-expression将调用deallocation函数   (3.7.4.2)。否则,是否取消分配是未指定的   函数将被调用。

C ++ 14为非空指针的情况添加了一些细节,但是null的情况是相同的。

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