我有一个CField类和一个包含CFd的2d数组的CBoard。
当我这样做时:
board(0,0)->Is (CField::CHECK)
我在Is()方法中遇到了段错误。 GDB在&之后指出我,所以我认为它与它有关。是什么原因?
完整代码:
http://pastebin.com/vetShYsL - 标题
http://pastebin.com/pGNPpa8N - 来源
答案 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]
,这是不存在的。