【问题标题】:How to write destructor for Trie tree如何为 Trie 树编写析构函数
【发布时间】:2018-08-16 06:56:12
【问题描述】:

我一直在做一个任务,它让我们使用特里树将字典中的单词添加到树中,然后搜索它。我坚持的部分是类析构函数。这是我第一次不得不处理析构函数/内存管理,下面是我在搜索我目前拥有的资源后的最佳猜测。

我在正确的轨道上吗?每个节点有 27 个子节点(字母表和分隔符),所以我希望它将它们从叶子节点到根节点全部删除。

class Trie
{
private:
    TrieNode *_root = nullptr;
    TrieNode *_current = nullptr;
    TrieNode *_child = nullptr;

    string current_word;
    bool setRoot = false;

protected:

public:
    Trie()
    {
        _root = new TrieNode{};
    }

    virtual ~Trie()
    {
        //TODO: clean up memory
        DestroyRecursive(_root);
    }

    void Trie::DestroyRecursive(TrieNode* node)
    {
        if (node != nullptr)
        {
            for (TrieNode* child : node->getChildren())
            {
                delete(child);
            }
        }
    }

如何检查析构函数是否正常工作?我正在使用 Visual Studio。

【问题讨论】:

    标签: c++ tree destructor trie


    【解决方案1】:

    您的 DestroyRecursive 实际上并不是递归的

    您需要在叶节点上调用delete,并在有子节点的节点上递归。

    void Trie::DestroyRecursive(TrieNode* node)
    {
        if (node != nullptr)
        {
            if (node->getChildren().size() == 0)
            {
                // delete the leaf node
                delete(node);
                return;
            }
    
            for (TrieNode* child : node->getChildren())
            {
                DestroyRecursive(child);
            }
        }
    }
    

    可能出错,具体取决于您的TrieNode 结构的依赖项。例如,它是否有一个重要的析构函数?

    通过替换指向std::shared_ptr的原始指针可以避免很多这种情况

    std::shared_ptr<TrieNode> _root = nullptr;
    vector<shared_ptr<TrieNode>> _child = nullptr;
    
    Trie()
    {
        _root = std::make_shared<TrieNode>();
    }
    

    那么在大多数情况下,您将不需要析构函数。当超出范围时,std::vectorshared_ptr 将负责在适当的内存上调用 delete。 请注意,所有权中没有循环依赖。如果以后添加父指针,它必须是原始指针或std::weak_ptr

    如何检查析构函数是否正常工作?我正在使用视觉 工作室。

    您可以输入breakpoint 来检查代码是否被命中。

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 2011-01-16
      • 1970-01-01
      • 2020-04-01
      • 2020-02-20
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多