整个计划:http://pastebin.com/x7gfSY5v
我创建了一个解析器,它从.txt文件中获取行,并根据其值将它们放在二叉搜索树中。 ID是第一个字符串,值是由/
分隔的以下字符串示例txt:
Abcd/foo/bar// #ID/value/value2
Abce/foo2// #ID/value
第一行会调用:
//parser
SequenceMap a; #has id and value member variables
a.writeAcronym(id); #Abcd
a.writeValue(value); #foo
insertNode(a, root); #Abcd/foo put into tree
a.writeValue(value2); #bar
insertNode(a, root); #Abcd/bar put into tree
创建树本身不会导致崩溃,并且它可以正常工作。只有在我崩溃时尝试访问树的最小值时才会这样。它仍然显示正确的最小值。
这是获得最小值的函数, 我怀疑这是问题的根本原因。
但是在main()中运行会崩溃我的程序:
string printMin(Node * x)
{
if (x == nullptr)
return nullptr; //this isn't ever called, I parse the tree before calling this fucntion
if (x->left == nullptr)
return x -> sqmap.getAcronym(); //returns correct value (end of program) then crash
else
printMin(x->left);
}
void printMain(){
cout << printMin(root) << endl;
}
主要():
a.parse("foo.txt"); //doesn't crash
a.printMain(); //crashes when called
//but doesn't crash if I remove both a.writeValue(value) from parser
这是插入/解析器:
void parse(string file) //uses delimiter to split lines
{
string line, id, value, value2;
ifstream myfile(file);
if (myfile.is_open())
{
while(getline(myfile, line))
{
if (!line.empty())
{
SequenceMap a;
istringstream is(line);
getline(is, id, '/');
a.writeAcronym(id);
getline(is,value, '/');
a.writeValue(value); //program doesn't crash if I remove this
insertNode(a, root);
getline(is,value2,'/');
if (value2 != "")
{
a.writeValue(value2); //program doesn't crash if I remove this
insertNode(a, root);
}
}
}
myfile.close();
}
else
cout << "Could not open file.";
}
/*****************************************************/
void insertNode(SequenceMap & sq, Node * & x)
{
if (x == nullptr)
x = new Node(sq, nullptr, nullptr);
else if (sq.getValue() < x->sqmap.getValue())
insertNode(sq, x->left);
else if (sq.getValue() > x->sqmap.getValue())
insertNode(sq, x->right);
else if (sq.getValue() == x->sqmap.getValue())
x->sqmap.Merge(sq);
}
我现在严重陷入困境,我唯一的猜测是这是一个记忆错误。一切都按预期工作,我确实得到了正确的最小值。但是在最后一行代码结束后,我得到了崩溃。我为树做了一个析构函数但是没有解决它。有人能想出来吗?
答案 0 :(得分:3)
printMin
不会返回值,因此您将从该节点返回垃圾,而不是string
。如果您使用警告进行编译,那么您应该收到警告。