如何解决我可以为类成员调用析构函数,该类成员是使用动态内存的对象吗?
如果我有以下课程:
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),应该没有泄漏。
请注意,name
和 arr
的“析构函数”也将被调用,但由于这些字段是指针,因此析构函数是 noops。
这可能泄漏的一种可能方式是,如果析构函数以异常退出——这就是(部分)为什么析构函数不应该抛出异常;与它们打交道很痛苦,而且容易出错。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。