c++ 出现奇怪的Segmentation failure

sir*_*ius 1 c++ segmentation-fault undefined-behavior

描述

SFDDManager是我自己创建的类,以下是我用于测试类 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 SFDD representing Zero
    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;
}
Run Code Online (Sandbox Code Playgroud)

之后make并运行。我有

Haha 1
Haha 2
Haha 3
Run Code Online (Sandbox Code Playgroud)

这意味着它有效。(执行到最后)

1. 分段错误1

在我评论这一行之后

sfdd6.save_file_as_dot("f=x11_and_x3");  // export sfdd6
Run Code Online (Sandbox Code Playgroud)

make又跑了,我得到了

Haha 1
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,因为该函数save_file_as_dot(string s)只是将 SFDD 类导出到dot文件(dot 是一种绘制简单图形的语言),我认为它应该无法避免分段错误。

2. 分段错误2

在我评论这一行之后(这次取消上面一行的评论)

SFDD sfdd1 = m.sfddZero();  // create a SFDD
Run Code Online (Sandbox Code Playgroud)

我有

Haha 1
Haha 2
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

这再次让我感到困惑,因为最后几行不使用 object sfdd1,为什么注释这一行可以避免语法错误?

为什么会出现这些分段错误?我所需要的只是一些解决这些问题的线索或方向。谢谢。

Iha*_*imi 5

您应该了解未定义行为的概念,在您的情况下,可以非常安全地假设您的代码在某个时刻调用此类行为,并且有时会导致程序由于分段错误而突然终止,有时则不会。

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