2010-10-29 146 views
0

我有一个CField类和一个包含CField的2d数组的CBoard。ANDing枚举时出现分段错误

当我这样做:

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

我得到的是一个段错误()方法。 GDB在&之后指向我,所以我认为它与它有关。原因是什么?

全码:
http://pastebin.com/vetShYsL - 头
http://pastebin.com/pGNPpa8N - 源

+0

提供更多的代码。你可能错误地设置了你的'board'。 – JoshD 2010-10-29 22:15:24

+2

'删除[]字段;' – sbi 2010-10-29 22:18:55

回答

2

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

这虽然

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

索引字段的错误由我不是X

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

我知道在某个地方有这样的错误!非常感谢! – Xirdus 2010-10-29 22:54:12

+0

单独的Create()方法对我很有用,因为我多次创建相同的类实例(将其返回到开始状态)。 – Xirdus 2010-10-30 08:01:22

+0

够公平的。如果可以的话,我只是喜欢RAII。 – 2010-11-01 15:00:15

1

在你的代码没有什么实际创建所需CBoard::fields阵列。所以当你的CField代码被调用时,this是一个无效的指针。

2

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

1

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

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

+0

在这种情况下,矢量是过度杀伤 - 我一直创建和删除整个表。 – Xirdus 2010-10-29 22:23:09

+1

矢量不会矫枉过正。你花这么多时间试图重写已经做过的事情是过度的。 – JoshD 2010-10-29 22:27:27

2

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

0

您的主板零为零。如果你看看你的逻辑,在operator(),你会尝试返回fields[0][0],这不存在。

+0

我的板子是9x9。请参阅编辑2.我的绑定检查是正确的,因为我检查是坏的,而不是正确的值。 – Xirdus 2010-10-29 22:28:44