C++编程中的三法则

Rule of three in C++ programming

本文关键字:编程 C++      更新时间:2023-10-16

我正在实现一个trie类,并遵循C++中的三个规则:具有非默认的coppy构造函数,赋值运算符和析构函数。但是,程序仍然崩溃。代码有什么问题?

class Trie
{
private:
    char ch;
    std::vector<Trie*> children;
public:
    std::string* word;
    static std::size_t nodeCount;
    Trie()
    {
        ch=0;
        word=NULL;
        ++nodeCount;
    };
    Trie(char c)
    {
        ch=c;
        word=NULL;
        ++nodeCount;
    };
    ~Trie()
    {
        cleanup();
        --nodeCount;
    };
    Trie(const Trie& source)
    {
        std::cout<<"hello world!n";
        ch=source.ch;       
        if (source.word)
            word = new std::string(*(source.word));
        for (int i=0; i<int(source.children.size()); i++)
        {
            Trie* newA=new Trie(*(source.children[i]));
            children.push_back(newA);
        }
    }
    Trie& operator=(const Trie &source)
    {
        cleanup();
        ch=source.ch;       
        if (source.word)
            word = new std::string(*(source.word));
        for (int i=0; i<int(source.children.size()); i++)
        {
            Trie* newA=new Trie(*(source.children[i]));
            children.push_back(newA);
        }
        return *this;
    }
    void cleanup()
    {
        for (int i=0; i<int(children.size()); i++)
        {
            delete children[i];
        }
        if (word)
            delete word;
    }

P/S:这是解构器的测试函数,代码通过测试:

TEST(memory)
{
  std::size_t base = Trie::nodeCount;
  // many nodes in the global Boggle trie
  CHECK( base == 0 );
  Trie *trie = new Trie();
  CHECK_EQUAL( base + 1, Trie::nodeCount );
  trie->addWord( "and" );
  CHECK_EQUAL( base + 4, Trie::nodeCount );
  trie->addWord( "ant" );
  CHECK_EQUAL( base + 5, Trie::nodeCount );
  delete trie;
  CHECK_EQUAL( base, Trie::nodeCount );
}

但是,代码未通过复制构造函数和赋值测试:

TEST(copyTrie)
{
  Trie trie;
  trie.addWord( "and" );
  trie.addWord( "ant" );
  CHECK_EQUAL( "and", *(trie.next('a')->next('n')->next('d')->word) );
  CHECK_EQUAL( "ant", *(trie.next('a')->next('n')->next('t')->word) );
  Trie copy( trie );
  CHECK_EQUAL( "and", *(copy.next('a')->next('n')->next('d')->word) );
  CHECK_EQUAL( "ant", *(copy.next('a')->next('n')->next('t')->word) );
  copy.addWord( "bee" );
  trie.addWord( "cat" );
}

它恰好在最后一个命令trie.addWord("cat")崩溃

您的 cleanup 函数不会清空children向量。