【问题标题】:C++ Inner Class Destructor Resource ManagementC++ 内部类析构函数资源管理
【发布时间】:2018-03-17 13:20:39
【问题描述】:

This 看起来与我要去的地方以及this 问题相似。

考虑以下

template<typename T>
class A
{

private:

    class B
    {

    private:

        B* link;

    public:

        B();
       ~B();

    };

    B* head;

public:

    A();
   ~A();
};

上面假设创建和链接每个B的函数被声明和定义

如果我执行如上图的操作,那么

B* position = head;
position = head->link;
head->link = nullptr;
delete[] head;
head = position;

我知道调用内部类析构函数将导致调用外部类析构函数。我是否正确处理了垃圾收集资源 x 或者我做了一些未定义的事情?

【问题讨论】:

  • 为什么您认为调用内部类析构函数(您在发布的示例中从未这样做过)会导致调用外部类析构函数?反过来,不是吗?
  • “我做了什么未定义的事情吗?”是的。在非数组类型上调用delete[] 是UB。
  • 我认为您将“内部”类误认为“基”类。如果基类具有虚拟析构函数,则在调用基(“内部”)类析构函数时将调用派生(“外部”)类的析构函数。而且 C++ 中没有“垃圾收集”。

标签: c++ memory-management destructor inner-classes


【解决方案1】:

在提供的代码中,内部类不会调用外部类的析构函数,也不应该调用,因为外部类只有一个指向内部类的指针作为成员。

如果A 是使用自动存储持续时间创建的(即作为没有新变量的变量),则不需要垃圾收集。超出范围时将被销毁。经验法则是每个new 都应该有一个匹配的delete

为了说明我已经简化了代码,将节点删除代码放在一个成员函数中,并提供了一个简单的使用示例:

struct A
{
    struct B
    {
        B* link;
    };
    B* head;
    void delete_head()
    {
        B* position = head;
        position = head->link;
        //head->link = nullptr; // not needed, it is being deleted anyway
        delete head; // not delete[]! This isn't an array pointer
        head = position;
    }
};

int main()
{
    A a;
    a.head = new A::B; // create head node
    a.head->link = new A::B; // create node
    a.delete_head(); // call A::~B()
    a.delete_head(); // call A::~B()
    // no more nodes in a, but A's destructor is not yet called
} // A::~A() is called here

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2014-05-27
    相关资源
    最近更新 更多