c – 释放包含字符串变量的结构
作者:互联网
我有以下结构
struct node
{
string name;
bool isDir;
int size;
string data; //lets store this as a string
timespec atime;
timespec ctime;
timespec mtime;
list <node*> children;
};
如果我有一个声明节点指针的话
node * directory = new node;
然后
用值填充它
然后最后使用
delete directory; //c++ construct
将所有的内存空间释放?我特别想知道字符串是否自动解除分配.
解决方法:
当你删除一个节点时,它的所有自动对象的析构函数都会被调用,包括std :: strings的析构函数,它们确实会释放它们自己,就像你结构中的std :: list之类的其他STL包含一样.
但是,子节点或任何其他堆对象不会被销毁,除非您自己删除它们,例如为Node对象创建析构函数,即:
struct Node {
...
list<Node*> mChildren;
virtual ~Node() {
for(auto& child : mChildren) delete child;
}
}
删除对象首先调用它的析构函数,因此在子节点上调用delete将使其删除它的子节点,依此类推,直到离开.
如果图形是树,则现代代码将使用unique_ptr在销毁节点时自动销毁节点的子节点:
struct Node {
...
list<unique_ptr<Node>> mChildren;
}
实际上,unique_ptr假定了唯一的所有权,因此,当它们的自动unique_ptr容器被销毁时,它们会删除它们包含的指针的指向对象,如果你以这种方式构建它,它可能会递归地销毁它的子节点.
您还可以将shared_ptr用于更复杂的图形结构,但显然问题是您需要处理循环引用,即节点应该只有weak_ptr到根节点,以便不会无效地增加它的引用计数并无效地使对象的生命无限.
标签:c,struct,delete-operator 来源: https://codeday.me/bug/20190831/1774514.html