给出下一个代码:
#include <iostream>
using namespace std;
class A
{
private:
~A () {}
};
int main()
{
A *a = new A();
delete a;
return 0;
}
它不编译。我认为删除是一个成员函数,不是吗? 如果是这样,它不应该访问A的dtor吗?
Regrads,Ron
答案 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。