无法弄清楚这个内存错误(程序结束后崩溃)

时间:2015-10-03 04:32:02

标签: c++

整个计划: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);
    }

我现在严重陷入困境,我唯一的猜测是这是一个记忆错误。一切都按预期工作,我确实得到了正确的最小值。但是在最后一行代码结束后,我得到了崩溃。我为树做了一个析构函数但是没有解决它。有人能想出来吗?

1 个答案:

答案 0 :(得分:3)

遍历左侧节点时,

printMin不会返回值,因此您将从该节点返回垃圾,而不是string。如果您使用警告进行编译,那么您应该收到警告。