描述

SFDD是我在SFDD / src /中创建的一个类,下面是文件test0.cpp,该文件用于测试此类SFDD。

#include <iostream>
#include <string>
#include "SFDD.h"

int main(int argc, char** argv) {

    vector<int> vars_order;
    int var_no = 18;
    for (int i = 1; i <= var_no; ++i) vars_order.push_back(i);

    Vtree* v = new Vtree(1, var_no*2-1, vars_order);
    v->save_file_as_dot("vtree");

    Manager m(v);

    SFDD sfdd1 = m.sfddZero();  // create a Zero SFDD

    SFDD sfdd2 = m.sfddOne();

    SFDD sfdd3 = m.sfddVar(3);

    SFDD sfdd4 = m.sfddVar(11);

    SFDD sfdd6 = sfdd3.And(sfdd4, m, true);
    sfdd6.save_file_as_dot("f=x11_and_x3");  // export sfdd6

    cout << "Haha 1" << endl;  // flag 1: for debugging

    SFDD sfdd8 = sfdd4.Xor(sfdd6, m, true);
    sfdd8.save_file_as_dot("f=x11_xor_(x11_and_x3)");

    cout << "Haha 2" << endl;  // flag 2: for debugging
    sfdd3.Xor(sfdd8, m, true).save_file_as_dot("f=x3_xor_x11_xor_(x11_and_x3)");

    cout << "Haha 3" << endl;  // flag 3: for debugging

    return 0;
}


make之后并运行./test0
我有

fang@ubuntu:~/Desktop/Link to GitHub/SFDD$ ./test0
Haha 1
Haha 2
Haha 3


这意味着它有效。

但!!!

1.分段故障1

我评论这行之后

sfdd6.save_file_as_dot("f=x11_and_x3");  // export sfdd6


make然后再次运行./test0,我得到了

fang@ubuntu:~/Desktop/Link to GitHub/SFDD$ ./test0
Haha 1
Segmentation fault (core dumped)


这让我感到困惑,因为我设计功能save_file_as_dot(string s)只是为了将SFDD类导出到dot文件,所以它不应该具有避免分段错误的能力。

2.分割错误2

我对此行发表评论后(这次取消评论)

SFDD sfdd1 = m.sfddZero();  // create a Zero SFDD


我有

fang@ubuntu:~/Desktop/Link to GitHub/SFDD$ ./test0
Haha 1
Haha 2
Segmentation fault (core dumped)


这也使我感到困惑,因为最后几行不使用对象sfdd1,它如何避免划定错误?

我将save_file_as_dot(string s)的一部分粘贴到SFDD / src / SFDD.cpp中

void SFDD::print_dot(fstream & out_dot, bool root, int depth, string dec_name) const {
    if (root) {
        out_dot << "digraph G {" << endl;
        if (is_terminal()) {
            if (is_constant()) {
                out_dot << "\t" << value << " [shape=record, label=\"" \
                << value << "\"]" << endl << "}";
                // << value << " ~ " << vtree_index << "\"]" << endl << "}";
            } else {
                out_dot << "\t";
                if (is_negative()) out_dot << "neg";
                out_dot << "x" << value/2 << " [shape=record, label=\"";
                if (is_negative()) out_dot << "-";
                out_dot << "x" << value/2 << "\"]" << endl << "}";
                // out_dot << "x" << value/2 << " ~ " << vtree_index << "\"]" << endl << "}";
            }
            return;
        }
    }
    if (elements.empty()) {
        if (value < 2) {
            out_dot << value;
            // out_dot << value << "~" << vtree_index;
        } else {
            if (is_negative()) out_dot << "-";
            out_dot << "x" << value/2;
            // out_dot << "x" << value/2 << "~" << vtree_index;
        }
        return;
    }
    ++depth;
    out_dot << "\t" << dec_name << " [shape=circle, label=\"" << vtree_index << "\"]" << endl;
    string e_name = "Ele_" + to_string(depth) + "_1";
    for (vector<Element>::const_iterator e = elements.begin();
    e != elements.end(); ++e) {
        e_name = check_dec_name(e_name);
        out_dot << "\t" << dec_name << " -> " << e_name << endl;
        e->print_dot(out_dot, depth, e_name);
    }
    if (root) out_dot << "}" << endl;
}

void SFDD::save_file_as_dot(const string f_name) const {
    fstream f;
    f.open("dotG/test0/"+f_name+".dot", fstream::out | fstream::trunc);
    print_dot(f, true);
    f.close();
}


参考

完整代码:https://github.com/fangbq/SFDD/blob/master/src/SFDD.cpp



为什么出现这些分割错误?
如何解决?

也许您有一些想法。

最佳答案

您应该了解Undefined Behavior的概念,在您的情况下,可以很安全地假设您的代码在某个时刻调用了此类行为,并且有时由于分段错误而导致程序突然终止,而有时却没有。

要解决此问题,您需要使用valgrind之类的工具。使用此工具或等效于您的操作系统和环境的工具,您应该能够找到发生冲突的确切位置,并解决根据与代码无关的代码部分出现和消失的明显的随机分段错误。真正的问题。

关于c++ - C++奇怪的段错误出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45906374/

10-13 06:28