C++编程中的三法则
Rule of three in C++ programming
我正在实现一个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
向量。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 试图修复一个错误,该错误不会让我开始编程其余部分
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 如何使用可变参数模板类使用模板元编程获得最大值