当默认的析构函数足够用于类时?

时间:2013-09-05 19:09:36

标签: c++ memory-management

假设我们有三个班级:父母,孩子和其他。

class Parent: {
public:
    Parent(std::string title): m_title(title) { }
    void setTitle (std::string title);
private:
    std::string m_title;
};

class Child: public Parent {
public:
    Child(std::string title) { setTitle(title); }
private:
    Other object;
};

class Other {
public:
    Other() : m_body("") { }
    std::string body();
    void setBody(std::string);
private:
    std::string m_body;
};

对所有这些类使用默认析构函数是否可以?

我的观点是,由于我没有手动分配任何内存,所以我不需要关心它的释放。

大问题:当默认析构函数足够时,是否有一般规则?

3 个答案:

答案 0 :(得分:4)

您需要为Parent定义虚拟析构函数,但析构函数的主体将在C ++ 11中默认或为空。它仍然是默认的析构函数,但您需要明确定义它,以便delete Child通过指向Parent的指针。

class Parent {
public:
    virtual ~Parent() = default;
    // virtual ~Parent() {} //
    // ...
};

在不考虑多态性的情况下,只需要在类需要在销毁时执行额外操作时才需要定义析构函数。例如,类可能需要释放手动管理的资源或从某处取消注册。另一个特殊情况是守卫,其唯一目的是在破坏方面做点什么。

我制作的几乎所有类都只有默认的析构函数。当我看到一个明确的析构函数定义时,我开始怀疑。

答案 1 :(得分:4)

如果您有一个指向Parent对象的指针,而Parent指向一个Child对象,而Parent没有虚析构函数,则不会调用Child的析构函数。因此,Parent需要一个虚拟析构函数,即使它是一个空的析构函数。 (除非你保证这种情况永远不会发生)。

Child在代码示例中不需要析构函数。将自动生成一个适当的,并且它将是虚拟的,因为父析构函数在固定代码中是虚拟的。

答案 2 :(得分:2)

  

大问题:当默认析构函数足够时,是否有一般规则?

如果你必须为这些类编写析构函数,它会做什么?

~Parent() { }

~Child() { }

~Other() { }

如果它们看起来像那样,那么就没有必要写它了。