Shane Hou
Shane Hou

Reputation: 5018

Strange errors: EXC_BAD_ACCESS in my class

Here is my code:

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()
{

}

On this->callMethodB();, a "EXC_BAD_ACCESS" occoured.

After that I found a work-around:

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

Then everything goes well... I just don't know what happened, but callMethodB() is just an empty method, there's nothing to do with it.

I'm using Apple LLVM 3.1, default setting.

UPDATE: Fixed my code.

Upvotes: 0

Views: 124

Answers (1)

David Heffernan
David Heffernan

Reputation: 612954

In this code:

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

you are writing over the end of itemSelector_.pItems because pItems is an array of length 2 but you are writing 3 elements.

That then overwrites startBtn_ which happens to appear immediately after itemSelector_ in memory. And that explains the error when you subsequently read the now corrupted startBtn_.

Either change your loop termination test, or increase the length of pItems. I can't tell which one is the correct solution, but clearly you will know.

Upvotes: 2

Related Questions