描述
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;
}
在 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/