具有指针结构的类是否需要析构函数

时间:2011-07-23 02:13:01

标签: c++ pointers structure destructor

我有一个类,它有一个带有指针作为其成员之一的结构。

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指针是如何被删除的?

4 个答案:

答案 0 :(得分:4)

是的,v1和v2可能会被泄露,如果它们未在程序的其他部分中取消分配。因此,在A的析构函数中,您可以删除v1和v2(如果它适合),或者您可以将析构函数添加到组中(在c ++中,结构与默认可见性之外的类完全相同 - 默认情况下,内容是公共的而不是私人)并在那里删除它们。当然,这取决于适当性(可能分配了一些其他东西并拥有v1和v2)。

答案 1 :(得分:0)

如果group拥有这些指针应该有一个析构函数来释放它们(具体取决于你如何分配它们)。此外,group的指针是new还是malloc?您确定需要void*而不是某种特定类型吗?

正如你所知,当group类型的对象被破坏时,这两个指针没有特别的事情发生,没有释放。理想情况下,您应该拥有这些指针的“所有权”概念。分配的类通常是应该解除分配的类。

答案 2 :(得分:0)

当超出范围时,类中的结构将被清除。但是,内存v1和v2指向的内存不会被自动清理。

答案 3 :(得分:0)

本质上,对于类和结构都没有默认的构造函数/析构函数。编译器根本无法确定如何进行默认析构函数。因此,如果您拥有自己管理的指针成员,则必须始终实现自己的构造函数和析构函数。如果你不拥有指针,那么你不必关心它,但仍然是一个很好的做法,有一个构造函数。