当您使用C ++编写类时,您何时编写自己的析构函数?

时间:2014-04-30 01:24:43

标签: c++

当你想编写自己的析构函数,覆盖默认的析构函数时,我在用C ++编写类时遇到了一些麻烦吗?我理解析构函数的目的是什么,当你不想使用编译器提供的那个时,我只是感到困惑。提前谢谢。

4 个答案:

答案 0 :(得分:2)

自定义析构函数用于释放您可能已动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,则您的自定义析构函数将确保释放/关闭所有这些资源。

答案 1 :(得分:2)

如果您不提供一个,编译器将为您添加一个,但这可能无法满足您的需要。通常,如果您在类中手动分配静态存储内存(通常在构造函数中并使用new),则析构函数必需。如果你的类破坏时也没有delete,那么内存将不会释放,你将有内存泄漏 =非常糟糕。

但是析构函数对于你想要完成的其他操作也很有用。

我个人通常不会编写析构函数,因为我永远不会分配内存我必须自己管理 - 感谢大多数现代C ++库中的共享指针和智能指针,你通常可以指望内存自动获取通过使用它们发布。例如,Qt有QSharedPointerstdboost具有类似的自动内存管理类。

答案 2 :(得分:1)

看一下rule of threeRAII成语,你会看到一些例子,说明我们为什么以及何时定义我们自己的析构函数。

答案 3 :(得分:0)

每当使用指针时,都需要定义自定义析构函数。参加以下课程:

class Foo {
    public:
        Foo(int&);
        Foo();
        ~Foo(); //Custom Destructor
        int* getData();
        void setData();
    private:
       int* data;
    };

这里一个类Foo存储一个指向整数的指针。由于我们存储指针,因此我们需要告诉C ++在销毁对象时删除该指针指向的数据。为此,请使用delete关键字,如下所示:

Foo::~Foo() {
    delete data;
}

如果未指定自定义析构函数,即使销毁对象,也不会删除数据。虽然存储整数的4个字节可能看起来不多,但在使用许多对象的大型程序中它可以加起来。

作为旁注(你可能没有这个,但值得一提),你应该总是将析构函数指定为虚拟。这样,如果有人扩展了类,程序将调用正确的析构函数,而不是默认为基类(这是某些多态情况下的默认行为)。