私人析构函数

时间:2011-02-07 10:37:20

标签: c++ memory-management

为什么我可以在免费存储上创建具有私有析构函数的类的对象,但不能在堆栈上创建?

例如,这是非法的:

class Foo
{
public:
   explicit Foo( int );
   static void delete_foo(Foo* foo ) { delete foo; }
private:
   int x;
   ~Foo();
   Foo( const Foo& );
   Foo& operator=(const Foo& );
};

int main()
{
   Foo * fooptr = new Foo(5); // legal
   Foo::delete_foo( fooptr ); // legal 
   Foo foo(5); // illegal
}

5 个答案:

答案 0 :(得分:18)

在堆栈上创建它时,必须先将其销毁,然后才能返回该函数。假设有问题的函数无法访问析构函数,则不允许这样做。

当你在免费商店中创建它时,它留给其他代码,它可以访问析构函数来销毁它。

具有私有析构函数的类的成员函数可以在堆栈上创建实例。甚至可以在没有预先存在的实例的情况下调用静态成员函数。但是,写这样的东西可能没有充分的理由。

答案 1 :(得分:10)

因为具有自动存储 *的对象需要自动销毁。所以析构函数需要可以调用;如果不是,则不能在自动存储中使用该类型。

相反,您可以在动态分配时删除它。当然,你可以不这样做。

*这里的对象在“典型”平台上通常分配在堆栈上。

答案 2 :(得分:2)

因为在free store上创建一个对象不需要公共析构函数,但是在堆栈上创建它会因为​​对象在超出作用域时会被销毁。您可以在免费商店中创建对象,但不能删除它,因此除非对象或朋友功能将其破坏,否则您将发生内存泄漏。

答案 3 :(得分:2)

只能在有权访问析构函数的作用域中在堆栈上创建一个。因此,您可以在类的友元函数或静态成员函数(甚至是常规类成员)中执行此操作。

本地变量的函数结束负责删除因此必须能够调用析构函数,尽管是隐式的。

如果您有权访问相应的构造函数,则可以从任何地方创建一个new。

如果您在智能指针中使用它,则必须确保删除它的位置具有访问权限。对于不同的智能指针,这可能会有所不同,对于某些人,您可以提供一个自定义析构函数,它可以是该类的静态成员。

答案 4 :(得分:0)

因为您可以强制执行始终动态分配对象,即使用新运算符。为了完成这项工作,你需要实现一个dispose()方法来调用"删除这个"在它返回之前。这样就可以创建在对象或对象的一部分被销毁之前调用的终结方法,因此可以在调用虚拟析构函数链之前安全地删除或断开实例成员。