c++出现奇怪的段错误

标签 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;
}

make 之后运行。我得到了

Haha 1
Haha 2
Haha 3

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

1。段错误 1

在我评论这一行之后

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

制作并再次运行,我得到了

Haha 1
Segmentation fault (core dumped)

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

2。段错误2

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

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

我得到了

Haha 1
Haha 2
Segmentation fault (core dumped)

这又让我感到困惑,因为最后几行没有使用对象 sfdd1,为什么注释这一行可以避免分割错误?

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

最佳答案

你应该知道的概念Undefined Behavior ,在您的情况下,可以很安全地假设您的代码在某个时刻调用此类行为,有时它会导致程序由于段错误而突然终止,有时它不会。

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

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

相关文章:

c++ - 样式化 QSystemTrayIcon 的 QMenu

c++ - 海湾合作委员会- "expected unqualified-id before ' )' token"

c - 结构指针的段错误

c - int a=1, b=a++;调用未定义的行为?

C程序中的困惑

c++ - 无法理解 C 和 C++ 中静态的行为

c++ - 为什么 if 语句和变量声明比循环中的加法更快?

c++ - 尝试访问类的字符串成员时出现段错误

c++ - 段错误 : 11 and malloc errors in C++ code

c++ - 条件运算符中的未定义行为