2017-10-05 127 views
0

This看起来类似于我所在的位置以及this问题。C++内部类破坏程序资源管理

考虑以下

template<typename T> 
class A 
{ 

private: 

    class B 
    { 

    private: 

     B* link; 

    public: 

     B(); 
     ~B(); 

    }; 

    B* head; 

public: 

    A(); 
    ~A(); 
}; 

上面生成以下假设函数来建立和连结各B被声明的结构和定义

EI6yn6W

如果我执行的操作,如上所示,然后

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

我明白,调用内部类析构函数将导致外部类析构函数被调用。我是否正确处理了垃圾收集资源x还是我做了一些未定义的内容?

+1

为什么你认为调用内部类的析构函数(你永远不会在你发布的示例中做)将导致外部类析构函数被调用?这是另一种方式,不是吗? – bnaecker

+1

“我做了一件未定义的东西吗?”是。在非数组类型上调用'delete []'是UB。 – bnaecker

+0

我认为你是错误的“内部”类与“基地”类。如果基类具有虚拟析构函数,则当调用base(“inner”)类析构函数时,将调用派生(“外部”)类的析构函数。而C++中没有“垃圾收集”。 – VTT

回答

0

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

如果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