gpt4 book ai didi

c++ - 释放包含字符串变量的结构

转载 作者:太空狗 更新时间:2023-10-29 20:41:40 26 4
gpt4 key购买 nike

我有以下结构

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++ - 释放包含字符串变量的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com