C++内部类破坏程序资源管理
问题描述:
This看起来类似于我所在的位置以及this问题。C++内部类破坏程序资源管理
考虑以下
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
还是我做了一些未定义的内容?
答
在提供的代码中,内部类不会调用外部类的析构函数,也不应该这样做,因为外部类只有一个指向内部类的指针作为成员。
如果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
为什么你认为调用内部类的析构函数(你永远不会在你发布的示例中做)将导致外部类析构函数被调用?这是另一种方式,不是吗? – bnaecker
“我做了一件未定义的东西吗?”是。在非数组类型上调用'delete []'是UB。 – bnaecker
我认为你是错误的“内部”类与“基地”类。如果基类具有虚拟析构函数,则当调用base(“inner”)类析构函数时,将调用派生(“外部”)类的析构函数。而C++中没有“垃圾收集”。 – VTT