2012-12-30 55 views
0

我试图序列化我的哈夫曼树到一个文件,但有问题的递归性问题。我没有麻烦打印到控制台使用cout,但当我尝试将其存储在字符串中或写入文件时出现分段错误。通过引用递归函数传递字符串或流对象时C++ segfault

string putData(Node *n, string &s) { 

    if (n->leaf()) { 
    s << "[" << n->value() << "]"; 
    } else { 
    s << "."; 
    } 

    if (n->left()) 
    putData(n->left(), s); 

    if (n->right()) 
    putData(n->right(), s); 

} 

这与流媒体对象是同一个问题。其实,在程序段错误之后,我检查了这个文件,其内容是否正确。但为什么最后会出现分割?如何停止该程序的分割?

string putData(Node *n, ofstream &s) { 

    s.open("huffout.txt", ios::app); 

    if (n->leaf()) { 
    s << "[" << n->value() << "]"; 
    } else { 
    s << "."; 
    } 
    s.close() 
    if (n->left()) 
    putData(n->left(), s); 

    if (n->right()) 
    putData(n->right(), s); 

} 
+2

你是如何将一个'ofstream&'传递给'string&'的东西? – chris

+1

您可能需要付出更多努力来自行调试。您是否确定了该程序崩溃的具体内容?你用过gdb来检查那个时候的变量吗?您能否发布展示问题的最简单的完整程序?如果您经历回答这些问题的过程,您可能会自己找到解决方案。 –

回答

3

你的函数声明为返回string但没有return语句,如果有什么看,可能会导致一个段错误的返回值。您的编译器应该已经警告过您缺少的回报,是不是编译时带有警告?

此外,第一个代码示例使用string,但试图附加到operator<<,可能这只是一个副本'n'paste错误。

+0

令人惊讶的是,任何人都可能错过返回类型。所以,我永远不会失败,帮助我愚弄自己。谢谢! –

+1

@ user1479360,有编译器警告。打开它们。 – chris