关于TRIE的Leetcode 208。我的解构者有什么问题?它从不工作[关闭]

问题描述 投票:-1回答:1
#include <string>
using std::string;

class Trie
{
private:
    Trie* p[26];
    bool end;
    void clear(Trie* pt)
    {
        for (int i = 0; i < 26; ++i)
        {
            if (pt->p[i])
            {    
                clear(pt->p[i]);
                delete pt->p[i];
            }
        }
    }
public:
    Trie():p(), end(false)
    {}

    void insert(string word)
    {
        Trie* pt = this;
        for (int i = 0; i < word.size(); ++i)
        {
            int idx = word[i] - 'a';
            if (!pt->p[idx])
            {
                pt->p[idx] = new Trie();
            }
            pt = pt->p[idx];
        }
        pt->end = true;
    }

    ~Trie()
    {
        clear(this);
    }
};

我在VS中调试并发现每次运行此行删除pt-> p [i]时,将再次调用解构函数,然后递归调用clear()函数。

此外,pt-> p [i]仍将指向相同的内存块,除非它无法访问。

在leetcode的这个问题的讨论部分中,大多数解决方案首先构建一个类TrieNode,因此如果删除TrieNode它不会引起问题,但我只是想知道我是否可以使我的代码仅使用一个类定义。

非常感谢提前!

c++ algorithm class trie
1个回答
1
投票

对于给定的i,你要清除p[i]两次。

进入:clear(pt->p[i]);

第二次在delete pt->p[i];,它只是叫clear(this),其中this是来自父母的pt->p[i]

您应该跳过clear(pt->pt[i])调用,因为它是由析构函数处理的。

对于仍然存在的指针,这正是应该发生的事情。在delete pt->p[i]之后,你可以使pt->p[i]无效。

PS:s / deconstructor / destructor /

© www.soinside.com 2019 - 2024. All rights reserved.