我有一个类,它有一个带有指针作为其成员之一的结构。
struct group {
void *v1,
void *v2;
};
class A {
A (group& handle)
: m_handle(handle)
private :
group m_handle;
};
A类中没有指针成员。当A中没有定义析构函数时,我没有看到任何问题(例如内存泄漏)。我已经知道当对象A超出范围时,A的析构函数被调用如果A中存在成员类,则会调用它们的析构函数,依此类推。那么,成员结构如上面的m_handle会发生什么 - 它们是否具有类似于析构函数的东西?当对象A超出范围时,结构组中的两个void指针是如何被删除的?
答案 0 :(得分:4)
是的,v1和v2可能会被泄露,如果它们未在程序的其他部分中取消分配。因此,在A的析构函数中,您可以删除v1和v2(如果它适合),或者您可以将析构函数添加到组中(在c ++中,结构与默认可见性之外的类完全相同 - 默认情况下,内容是公共的而不是私人)并在那里删除它们。当然,这取决于适当性(可能分配了一些其他东西并拥有v1和v2)。
答案 1 :(得分:0)
如果group
拥有这些指针它应该有一个析构函数来释放它们(具体取决于你如何分配它们)。此外,group
的指针是new
还是malloc
?您确定需要void*
而不是某种特定类型吗?
正如你所知,当group
类型的对象被破坏时,这两个指针没有特别的事情发生,没有释放。理想情况下,您应该拥有这些指针的“所有权”概念。分配的类通常是应该解除分配的类。
答案 2 :(得分:0)
当超出范围时,类中的结构将被清除。但是,内存v1和v2指向的内存不会被自动清理。
答案 3 :(得分:0)
本质上,对于类和结构都没有默认的构造函数/析构函数。编译器根本无法确定如何进行默认析构函数。因此,如果您拥有自己管理的指针成员,则必须始终实现自己的构造函数和析构函数。如果你不拥有指针,那么你不必关心它,但仍然是一个很好的做法,有一个构造函数。