sir*_*ius 1 c++ segmentation-fault undefined-behavior
SFDD
和Manager
是我自己创建的类,以下是我用于测试类 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)
这意味着它有效。(执行到最后)
在我评论这一行之后
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 是一种绘制简单图形的语言),我认为它应该无法避免分段错误。
在我评论这一行之后(这次取消上面一行的评论)
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
,为什么注释这一行可以避免语法错误?
为什么会出现这些分段错误?我所需要的只是一些解决这些问题的线索或方向。谢谢。
您应该了解未定义行为的概念,在您的情况下,可以非常安全地假设您的代码在某个时刻调用此类行为,并且有时会导致程序由于分段错误而突然终止,有时则不会。
为了解决这个问题,你需要一个像valgrind这样的工具。使用此工具或适用于您的操作系统和环境的等效工具,您应该能够找到发生违规的确切位置,并解决根据与代码无关的部分出现和消失的明显随机分段错误。真正的问题。