代码之家  ›  专栏  ›  技术社区  ›  sharptooth

当我对空指针调用“delete”时,为什么要调用“operator delete”?

  •  17
  • sharptooth  · 技术社区  · 14 年前

    在阅读答案时 this question 我注意到答案( this 例如)暗示 operator delete 即使在 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;
    }
    

    对我来说很意外- Test::operator delete() ptr 持有空指针。

    据我所知 operator new 分配内存和 将内存返回给分配器。如果我打电话 删除

    删除 语句包括调用析构函数。当我传递空指针时,析构函数肯定不会被调用——C++会处理这个问题。那为什么呢 操作员删除

    2 回复  |  直到 7 年前
        1
  •  19
  •   Ben Voigt    14 年前

    即将到来的C++ 0x标准中的语言(5.3.5节) [expr.delete] )具体如下:

    delete表达式不是null 将调用释放函数 (3.7.4.2). 否则,就是这样 函数将被调用。[注:以下为 调用了释放函数 不管析构函数 对于对象或对象的某个元素 数组引发异常。[尾注]

    所以这是未指定的行为,一些编译器可能会调用 operator delete 删除空指针时,其他指针可能不会。

    编辑:术语 解除分配函数 这个标准的使用似乎引起了一些混乱。它附带了一个参考资料。3.7.4.2中的一些关键语言 [basic.stc.dynamic.deallocation] 这可能有助于澄清:

    如果一个班级 T 具有名为 操作员删除 如果只有一个参数,那么该函数就是一个常见的(非放置)释放函数。

    该标准也非常明确,用户自定义的 操作员删除 需要接受一个为空指针值的参数:

    价值 提供给解除分配函数的第一个参数可能是空指针值;如果是,以及解除分配

    但由于5.3.5中未指明的行为,您不应该依赖于 指针为空时被调用。

        2
  •  9
  •   Tyler McHenry    14 年前

    操作符delete和其他操作符一样,为什么不调用它呢?它不能检验自己的论点 之前 正在调用。

    这就像在问为什么 operator+ 在添加0时调用。