删除是会员功能吗?私有的析构函数不会被删除调用?

时间:2011-08-27 21:38:47

标签: c++

给出下一个代码:

#include <iostream>
using namespace std;

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

int main()
{

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

}

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

Regrads,Ron

6 个答案:

答案 0 :(得分:3)

不,delete不是会员功能;这是一个运营商。 operator delete()运算符调用delete函数,但除非您将其定义为成员,否则它不是成员。

答案 1 :(得分:3)

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

class Foo
{
    Foo()
    {
    }
}

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

答案 2 :(得分:2)

谜语的解决方案:不,删除不是成员函数

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

答案 3 :(得分:2)

如果你对编译器说方法是私有的,只有类可以调用它。

在您的情况下,这意味着只有您的班级才能删除自己。

答案 4 :(得分:2)

这与删除操作符无关。相反,问题是析构函数是私有的,当你调用delete 表达式 delete a;时,这相当于a->~A(); ::operator delete(a);这就是这个首先调用失败的析构函数,而不是调用delete操作符。

即使你重载了成员new / delete操作符,也不会改变一个东西,因为它是delete 表达式,它首先调用析构函数然后调用(成员)运算符,所以析构函数必须可以作为公共职能部门使用。

答案 5 :(得分:1)

通过删除方法的实现,您对删除调用感到困惑。

如果你打电话给删除,实际上会发生两件事:

  • 析构函数被称为
  • 释放内存

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

这就是为什么你需要访问delete方法和析构函数才能调用delete。