我有以下结构
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
是否会释放所有内存空间?我特别想知道字符串是否自动解除分配。
答案 0 :(得分:4)
当你删除一个节点时,它的所有自动对象的析构函数都会被调用,包括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到根节点,以便不会无效地增加它的引用计数和无效地使对象的生命无限。
答案 1 :(得分:1)
Are arrays in structs freed on deletion?
结构中的数组是一个自动对象,其生命周期是 与struct的实例绑定。是的,当你删除一个实例时 对于struct,数组的内存也会自动释放。 所有非指针成员都是如此。