其他分享
首页 > 其他分享> > c – 释放包含字符串变量的结构

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