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

Can I call destructor for a class member, which is an object using dynamic memory?

如果我有以下类:

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 的“析构函数”也将被调用,但由于这些字段是指针,析构函数是空的。

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