奇怪的错误:我班上的EXC_BAD_ACCESS

时间:2012-04-28 13:08:12

标签: c++ ios llvm

这是我的代码:

typedef struct TItemSelector{
  ItemSelectFrame* pItems[2];
} SItemSelector;

class item {
  public:
  void expMethod();
  SItemSelector itemSelector_;
  UILayerButton* startBtn_;
};

void item::expMethod(){
startBtn_ = new UILayerButton();
for (i = 0; i < 3; i++) {
  itemSelector_.pItems[i] = new ItemSelectFrame();
}
startBtn_->callMethodA();
}

void UILayerButton::callMethodA()
{
  this->callMethodB();
}

void UILayerButton::callMethodB()
{

}

this->callMethodB();上,&#34; EXC_BAD_ACCESS&#34; occoured。

之后我找到了解决办法:

class item {
  public:
  void expMethod();
  SItemSelector itemSelector_;
  SItemSelector itemSelector2_; // work around
  UILayerButton* startBtn_;
};

然后一切顺利......我只是不知道发生了什么,但callMethodB()只是一个空洞的方法,与它没有任何关系。

我正在使用Apple LLVM 3.1,默认设置。

更新:修正了我的代码。

1 个答案:

答案 0 :(得分:2)

在此代码中:

for (i = 0; i < 3; i++) {
  itemSelector_.pItems[i] = new ItemSelectFrame();
}

您正在撰写itemSelector_.pItems的末尾,因为pItems是一个长度为2的数组,但您正在编写3个元素。

然后覆盖startBtn_恰好出现在内存itemSelector_之后的startBtn_。这可以解释当您随后阅读已损坏的pItems时的错误。

更改循环终止测试,或增加{{1}}的长度。我不知道哪一个是正确的解决方案,但显然你会知道。