我可以为 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), 应该没有泄漏。
请注意,name
和 arr
的“析构函数”也将被调用,但由于这些字段是指针,析构函数是空的。
这可能泄漏的一种可能方式是,如果析构函数以异常退出——这就是为什么析构函数永远不应该抛出异常的(部分原因);与他们打交道很痛苦,而且容易出错。
如果我有以下类:
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
的“析构函数”也将被调用,但由于这些字段是指针,析构函数是空的。
这可能泄漏的一种可能方式是,如果析构函数以异常退出——这就是为什么析构函数永远不应该抛出异常的(部分原因);与他们打交道很痛苦,而且容易出错。