【问题标题】:Delete is a member function ? destructor in private won't be invoked with delete?删除是成员函数?私有析构函数不会被删除调用?
【发布时间】:2011-11-05 06:16:30
【问题描述】:

给定下一个代码:

#include <iostream>
using namespace std;

class A
{
private:
    ~A () {}
};

int main()
{

    A *a = new A();
    delete a;
    return 0;

}

它不能编译。我认为 delete 是一个成员函数,不是吗? 如果是这样,它不应该访问 A 的 dtor 吗?

毕业了,罗恩

【问题讨论】:

    标签: c++


    【解决方案1】:

    不,delete 不是成员函数;它是一个运算符。有一个 operator delete() 函数由 delete 运算符调用,但它不是成员,除非您这样定义。

    【讨论】:

      【解决方案2】:

      按照这个逻辑,这将是有效的代码:

      class Foo
      {
          Foo()
          {
          }
      }
      
      int main()
      {
          // new is also a member function, right?
          Foo* Bar = new Foo;
      }
      

      【讨论】:

        【解决方案3】:

        谜语解法:不,delete不是成员函数

        Delete 是一个运算符,可以为类型重载,但不能作为成员函数重载

        【讨论】:

          【解决方案4】:

          如果你告诉编译器一个方法是私有的,那么只有类可以调用它。

          在你的情况下,这意味着只有你的班级可以删除自己。

          【讨论】:

            【解决方案5】:

            这与删除操作符无关。而是,问题在于 destructor 是私有的,当你调用 delete expression delete a;,这相当于a-&gt;~A(); ::operator delete(a); 这是第一次调用失败的析构函数,而不是删除操作符的调用。

            即使你重载了成员 new/delete 操作符,也不会改变任何事情,因为它是 delete expression 首先调用析构函数,然后是(成员)操作符,所以析构函数必须可作为公共功能使用。

            【讨论】:

            • 从概念上讲,它是等价的。从技术上讲,it is not.
            【解决方案6】:

            您将 delete 调用与 delete 方法的实现混淆了。

            如果你调用 delete,实际上会发生 2 件事:

            • 析构函数被调用
            • 内存被释放

            默认情况下,内存将通过默认删除方法释放。如果你实现 delete 方法,你的实现应该只释放内存,而不是调用任何析构函数。

            这就是为什么在调用 delete 之前您需要同时访问 delete 方法和析构函数。

            【讨论】:

              猜你喜欢
              • 2012-09-01
              • 2012-03-13
              • 2013-09-30
              • 1970-01-01
              • 2010-11-08
              • 2013-11-16
              • 1970-01-01
              • 2014-12-27
              • 2011-03-23
              相关资源
              最近更新 更多