我正在尝试编写一个程序来模拟霍夫曼编码和解码。为了做到这一点,我需要在文本文件中序列化二叉树,这样我以后可以再次读取它并重建树(当解码霍夫曼文件时)。
然而,在我的函数(readBinaryTree)读取文件(递归)后,程序才停止执行。我以前从没见过这个。
以下是代码:
if (!decode) {
.
.
.
//alot of stuff here
.
.
.
}
else if (decode) {
std::ifstream keyFile("hufftreekey.txt");
Node* HuffTree = NULL;
std::cout << "PRE!" << std::endl;
readBinaryTree(HuffTree, keyFile); //THIS FUNCTION EXECUTES, BUT NOTHING AFTER IT DOES
std::cout << "POST!" << std::endl;
std::map<char, std::string> codes = buildCodes(HuffTree);
std::ofstream outFile;
outFile.open ("mobydick_decoded.txt.huff");
char c;
std::ifstream input( argv[ 1 ] );
while (input >> std::noskipws >> c) {
if (codes.find(c) != codes.end()) {
std::string huffcode = codes[c];
outFile << huffcode;
}
else{
std::cout << "ERROR!" << std::endl;
}
}
outFile.close();
}
终端输出是&#34; PRE!&#34;,但它从不打印&#34; POST!&#34;。我没有收到任何错误消息,没有抛出异常,它只是从不打印,并且在执行函数之后没有执行任何操作。
这是功能:
void readBinaryTree(Node* root, std::ifstream &fin){
std::string s_val;
char val;
std::getline(fin, s_val);
val = s_val[0];
if(val == '#')
return;
else if(val == '_') {
root = new Node();
if (root == NULL) {
std::cout << "MEMORY ALLOC FAILURE!" << std::endl;
}
root->content = '_';
readBinaryTree(root->leftChild, fin);
readBinaryTree(root->rightChild, fin);
}
else {
root = new Node();
if (root == NULL) {
std::cout << "MEMORY ALLOC FAILURE!" << std::endl;
}
root->content = val;
readBinaryTree(root->leftChild, fin);
readBinaryTree(root->rightChild, fin);
}
}
这不是一个无限循环问题,程序结束但它似乎在调用readBinaryTree函数后跳过所有内容
答案 0 :(得分:3)
您没有构建二叉树。你正在泄漏记忆,就像筛子泄漏雨水,然后执行未定义的行为来增加伤害。
改变这个:
void readBinaryTree(Node* root, std::ifstream &fin)
到此:
void readBinaryTree(Node*& root, std::ifstream &fin)
// see addition here ====^
尝试通过引用(或地址)传递指针,看看会发生什么。
答案 1 :(得分:2)
在C ++中,如果new失败,它将不会使指定的指针为NULL。它将抛出std::bad_alloc
异常。我的猜测是root = new Node();
失败并且引发了异常,但C ++没有发现任何问题(在C ++中调用try{...}Catch{...}
进行异常处理)。根据C ++标准,所有未捕获的异常都会导致程序立即终止。因此&#34; PRE!&#34;印刷了但是&#34; POST!&#34;不是。如果您确实想使用if(ROOT == NULL)
检查动态内存分配是否成功,请使用以下新位置:
root = new (nothrow) node();
nothrow描述符确保new不会抛出异常,并且如果失败则总是返回NULL。
我希望我的解释有所帮助。