这是我的代码:

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();上,出现“ EXC_BAD_ACCESS”。

之后,我找到了解决方法:

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


然后一切顺利...我只是不知道发生了什么,但是callMethodB()只是一个空方法,与它无关。

我使用的是Apple LLVM 3.1,默认设置。

更新:修复了我的代码。

最佳答案

在此代码中:

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


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

然后,这将覆盖startBtn_,后者恰好出现在内存中的itemSelector_之后。当您随后读取已损坏的startBtn_时,这将解释该错误。

更改循环终止测试,或增加pItems的长度。我无法确定哪一个是正确的解决方案,但显然您会知道的。

关于c++ - 奇怪的错误:我类的EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10363767/

10-14 00:01