Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数执行失败后的代码-C++_C++_Runtime Error_Execution_Skip - Fatal编程技术网

函数执行失败后的代码-C++

函数执行失败后的代码-C++,c++,runtime-error,execution,skip,C++,Runtime Error,Execution,Skip,我试图写一个程序来模拟哈夫曼编码和解码。为了做到这一点,我需要在一个文本文件中序列化一个二叉树,这样我以后可以再次读取它,并在解码哈夫曼文件时重建树 但是,在我的函数readBinaryTree读取递归文件之后,程序就停止执行。我以前从未见过这种情况 代码如下: if (!decode) { . . . //alot of stuff here . . . } else if (decode) { std::ifstream

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

但是,在我的函数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();

}
终端中的输出是预处理的!,但它从不打印邮件!。我没有收到任何错误消息,没有抛出异常,它只是从不打印,调用函数后也不会执行任何操作

这就是功能:

 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);
 }
}


这不是无限循环问题,程序结束了,但是在C++中的RealBidiar树函数被称为

< P>后,它似乎跳过了所有的东西,如果新的失败,它不会使指定的指针为空。它将抛出std::bad_alloc异常。我猜根=新节点;失败,并且引发异常,但C++中的C++查证{…} catch {{}}没有异常捕获。根据C++标准,所有未被允许的异常将导致程序立即终止。这样的预演!是打印出来的,但是邮寄!没有。如果您确实想使用ifROOT==NULL检查动态内存分配是否成功,请使用新位置,如:

root = new (nothrow) node();
nothrow描述符确保new不会引发异常,并且在异常失败时始终返回NULL


我希望我的解释能有所帮助
root = new (nothrow) node();
nothrow描述符确保new不会引发异常,并且在异常失败时始终返回NULL


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

您不是在构建二叉树。你在泄漏记忆,就像筛子在漏雨一样,然后执行未定义的行为来增加伤害

更改此项:

void readBinaryTree(Node* root, std::ifstream &fin)
为此:

void readBinaryTree(Node*& root, std::ifstream &fin)

// see addition here ====^

尝试通过引用或地址传递该指针,看看会发生什么。

您不是在构建二叉树。你在泄漏记忆,就像筛子在漏雨一样,然后执行未定义的行为来增加伤害

更改此项:

void readBinaryTree(Node* root, std::ifstream &fin)
为此:

void readBinaryTree(Node*& root, std::ifstream &fin)

// see addition here ====^

尝试通过引用或地址传递指针,看看会发生什么。

您在哪个平台上?它只是挂起了,还是程序只是退出了?我是在Windows8.1的cygwin上用g++编译的。它根本没有挂起,只是简单地退出,就好像它已经完成了一样。我不熟悉cygwin如何处理各种情况。我猜进程会因为一些问题而被终止,比如超过堆栈空间,等等。如果是这样的话,通过new分配内存不会失败并创建空指针吗?我已经修改了代码,在分配后检查空指针,但这似乎不是问题所在。不管怎样,我只是对cygwin了解不够。如果可以,可以使用Visual Studio或Linux运行。您在哪个平台上?它只是挂起了,还是程序只是退出了?我是在Windows8.1的cygwin上用g++编译的。它根本没有挂起,只是简单地退出,就好像它已经完成了一样。我不熟悉cygwin如何处理各种情况。我猜进程会因为一些问题而被终止,比如超过堆栈空间,等等。如果是这样的话,通过new分配内存不会失败并创建空指针吗?我已经修改了代码,在分配后检查空指针,但这似乎不是问题所在。不管怎样,我只是对cygwin了解不够。如果可以,请使用Visual Studio或Linux运行。@compscimaster:另外,请注意,在使用g++的Linux上,它将打印出未捕获的异常。我不知道它在cygwin上做了什么。@compscimaster:另外,请注意,在使用g++的Linux上,它将打印出未捕获的异常。我不知道它对cygwin有什么作用。谢谢你的建议,我修正了代码。然而,我在linux中运行了它,它似乎是在gdb中运行的,而且在函数的末尾我似乎遇到了seg故障。获取此错误消息:程序收到信号SIGSEGV,分段错误_int_malloc av=0x7ffff78b9760,malloc.c:3302 3302 malloc.c:没有这样的文件或目录。@compscimaster这将是一个完全不同的问题,与以下事实有关:通过上述更改,您实际上保留了分配的所有数据。我觉得修复上面的代码会暴露代码中的其他问题。在这一点上,你应该
d将Valgrind置于代码之上,而不仅仅是gdb。并仔细考虑代码路径中可能存在的缺陷。我可以再看一眼,看看它有什么明显的特点,但它不是一个在线交互调试的论坛。至少这部分是固定的。@compscimaster和注意:节点的所有构造函数最初都应该将leftChild和rightChild成员设置为null。理想情况下,您可以创建一个实际将内容作为参数的构造函数。它将简化您的代码,并减少以后使用无效指针的机会。感谢您的建议,我修复了代码。然而,我在linux中运行了它,它似乎是在gdb中运行的,而且在函数的末尾我似乎遇到了seg故障。获取此错误消息:程序收到信号SIGSEGV,分段错误_int_malloc av=0x7ffff78b9760,malloc.c:3302 3302 malloc.c:没有这样的文件或目录。@compscimaster这将是一个完全不同的问题,与以下事实有关:通过上述更改,您实际上保留了分配的所有数据。我觉得修复上面的代码会暴露代码中的其他问题。在这一点上,您应该在代码上使用Valgrind lose,而不仅仅是gdb。并仔细考虑代码路径中可能存在的缺陷。我可以再看一眼,看看它有什么明显的特点,但它不是一个在线交互调试的论坛。至少这部分是固定的。@compscimaster和注意:节点的所有构造函数最初都应该将leftChild和rightChild成员设置为null。理想情况下,您可以创建一个实际将内容作为参数的构造函数。它将简化您的代码,并减少以后使用无效指针的机会。