函数无法执行后的代码 - c ++

时间:2014-04-30 02:32:09

标签: c++ runtime-error execution skip

我正在尝试编写一个程序来模拟霍夫曼编码和解码。为了做到这一点,我需要在文本文件中序列化二叉树,这样我以后可以再次读取它并重建树(当解码霍夫曼文件时)。

然而,在我的函数(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函数后跳过所有内容

2 个答案:

答案 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。

我希望我的解释有所帮助。