我可以为类成员调用析构函数,该类成员是使用动态内存的对象吗?

问题描述

如果我有以下课程:

class Small {
public:
    Small();
    Small(const Small &small);
    ~Small();
private:
    int *arr;
};

class Big {
public:
    Big();
    Big(const Big &big);
    ~Big();
private:
    char *name;
    Small smallObject;
};

当我调用 ~Big() 时,我删除了为 name 成员分配的动态内存,但 smallObject 也使用了我没有释放的动态内存。 当我尝试类似

Big::~Big() {
    delete[] this->name;
    this->smallObject.~Small();
}

我收到一个错误(因为没有这样的语法)。如何释放分配给 smallObject 的动态内存?

解决方法

每当 Big 等复合对象的析构函数完成时,它会自动调用所有成员对象和基对象的析构函数,因此您不想显式调用此类析构函数。如果这样做,对象析构函数将被调用两次,这会导致问题。

所以在这种情况下,Big 析构函数将自动调用 Small 析构函数,并且,假设删除指针(或任何其他需要做的事情来清理 Small::arr),应该没有泄漏。

请注意,namearr 的“析构函数”也将被调用,但由于这些字段是指针,因此析构函数是 noops。

这可能泄漏的一种可能方式是,如果析构函数以异常退出——这就是(部分)为什么析构函数不应该抛出异常;与它们打交道很痛苦,而且容易出错。