【问题标题】:Is destructor required for a class with structure of pointers具有指针结构的类是否需要析构函数
【发布时间】:2011-10-11 11:40:54
【问题描述】:

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

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

【问题讨论】:

  • 关于“已删除”指针的语言不清楚。指针本身被删除就好了,但正如其他人指出的那样,它们指向的任何内存都不会被删除。

标签: c++ pointers structure destructor


【解决方案1】:

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

【讨论】:

  • 谢谢..确实v1和v2是由另一个模块分配的。所以我们有API来删除结构..看起来我需要在A的析构函数中调用deleteGroup API。这是我的想法太..但是我正在开发的软件没有定义诸如 A 的析构函数,我在 purify 中看不到任何内存泄漏
  • 您可能不应该删除 void*,假设它们是指向 C++ 对象的指针,而不仅仅是内存块。如果它们是指向内存块的指针,为什么要使用 void* 而不是 uint8_t 或更具描述性的东西?删除 void* 的可观察到的问题是不会调用析构函数,因此如果它是类的实例,则违反了类的 API。按照标准,在 void* 上调用 delete 是未定义的行为。
  • @Dan - struct group 中的 v2 指向另一个组,或者它可以是另一个包含 float、string 或 int 的联合。这种情况下删除v2可以吗?
  • @srikrish - 不,因为您指向的组的析构函数不会被调用,因此它指向的任何组都不会被删除。因此,如果您有 3 个“组”实例(我将它们称为 A、B 和 C)并且 A 指向 B,B 指向 C,并且您在 A 上调用 delete,如果您实现析构函数,您将在 B 上调用 delete ,但是由于发生了类型擦除,B 的析构函数将不会被调用并且 C 会泄漏。至少大多数实现都会发生这种情况,但由于在 void* 上调用 delete 是未定义的,我什至不能保证它总是会这样。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      本质上,无论是对于类还是对于结构,都没有默认的构造函数/析构函数。编译器根本无法弄清楚如何执行默认析构函数。因此,如果您有自己管理的指针成员,则必须始终实现自己的构造函数和析构函数。如果您不拥有指针,则不必关心它,但拥有构造函数仍然是一种好习惯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2015-02-26
        • 2013-04-03
        • 2017-04-21
        • 2014-12-12
        • 1970-01-01
        相关资源
        最近更新 更多