我什么时候需要声明自己的析构函数?

0ct*_*gon 15 c++ destructor class

class Point    
{
public:
    float x,y;
    Point() {}
    Point(float,float);
    Point operator + (Point);
    Point operator * (double);
    void rotate_p(float);
    void render_p(Point*);
    void sub(float);
    float get_dist();//get_distance
};
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这个类没有指针作为非静态 数据成员,所以我想我可以使用默认的析构函数; 这准确吗?


  • 我什么时候需要声明自己的析构函数?

Fil*_*efp 13

介绍

由于具有自动存储持续时间的数据成员的生命周期与具有它们的实例的生命周期绑定,因此您无需显式调用其析构函数; 只要类的实例是,它们将永远被销毁.


我什么时候通常需要声明自己的析构函数?

通常,如果出现以下情况,您将必须显式声明自己的析构函数:

  • 你声明一个类应该作为涉及多态的继承的基础,如果你这样做,你需要一个虚拟析构函数来确保在通过对Base的指针/引用销毁它时调用Derived类的析构函数.

  • 您需要释放该类在其leftime期间获取的资源

    • 示例1:类具有文件句柄,当对象析构时需要关闭; 析构函数是完美的位置.

    • 示例2:该类拥有一个具有动态存储持续时间的对象,因为对象的生命周期可能在类实例被销毁后很长时间内存在,您需要在析构函数中明确地销毁它.


隐式生成的析构函数

除非您明确声明自己的析构函数,否则编译器将为您创建隐式生成的析构函数.

14.4p4 析构函数 [class.dtor]

如果类没有用户声明的析构函数,则析构函数将隐式声明为默认值(8.4).隐式声明的析构函数是其类的内联公共成员.

src:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf


然而,有一些罕见/高级的情况,编译器将拒绝为您生成析构函数,在这些情况下,您必须显式声明自己的析构函数,或者确保永远不会调用类实例的析构函数; 因为为了销毁一个对象,需要一个析构函数.

14.4p5 析构函数 [class.dtor]

如果出现以下情况,则将类X的默认析构函数定义为delete:

  • X是一个类似联合的类,它有一个带有非平凡析构函数的变体成员,

  • 任何非静态数据成员都有类型M(或其数组),M有一个删除的析构函数或析构函数,默认析构函数是不可访问的,

  • 任何直接或虚拟基类都有一个已删除的析构函数或析构函数,默认析构函数无法访问,

  • 或者,对于虚拟析构函数,查找非数组释放函数会导致歧义或在默认析构函数中删除或无法访问的函数中.

src:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf


可以通过以下链接阅读更多内容: