ANDing枚举时的分段错误

时间:2010-10-29 22:11:01

标签: c++ segmentation-fault

我有一个CField类和一个包含CFd的2d数组的CBoard。

当我这样做时:

board(0,0)->Is (CField::CHECK)

我在Is()方法中遇到了段错误。 GDB在&之后指出我,所以我认为它与它有关。是什么原因?

完整代码:
http://pastebin.com/vetShYsL - 标题
http://pastebin.com/pGNPpa8N - 来源

6 个答案:

答案 0 :(得分:2)

这可能与&无关。最可能的原因是board(0,0)返回了无效(或NULL)指针。

答案 1 :(得分:2)

当您在新创建的operator()对象上调用它时,CBoard将返回空指针。取消引用空指针将导致未定义的行为,在您的情况下是段错误。

答案 2 :(得分:2)

电路板的2阶段构造有点烦人,你需要一堆额外的代码来管理你真正不需要的代码。

这是错误

    for (int i = 0; i < x; ++i)
            fields [x] = new CField [y];

索引字段由i而不是x

    for (int i = 0; i < x; ++i)
            fields [i] = new CField [y];

答案 3 :(得分:1)

您的代码中没有任何内容实际创建CBoard::fields所需的数组。因此,当您调用CField代码时,this是无效指针。

答案 4 :(得分:1)

这里可能存在许多可能出现的问题。由于您未发布Create CBoard方法,因此我不知道您是否正在为fields正确分配存储空间。无论如何,CField* operator() (int x_, int y_) const可能只是返回null,因为您编写的条件未评估为true。你在这里检查空指针吗?

此外,为什么不使用std::vector而不是参与这个疯狂的双指针内存管理?

答案 5 :(得分:0)

你的董事会零归零。如果你看一下你的逻辑,在operator(),你会尝试返回fields[0][0],这是不存在的。