2012-04-28 47 views
0

这里是我的代码:奇怪的错误:EXC_BAD_ACCESS在我的课

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” occoured。

之后,我发现了一个变通办法:

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

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

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

更新:修复了我的代码。

+0

呃,关于EXC_BAD_ACCESS有什么“奇怪的”?你在某处使用了一个无效指针。 (你在哪里设置startBtn_?) – 2012-04-28 13:25:57

+0

Sry我错过了一条线,修复了。 @HotLicks – 2012-04-28 13:39:12

+0

很难分辨你发布的内容。你可以添加'UILayerButton'的定义吗? – starbugs 2012-04-28 13:42:47

回答

2

在此代码:

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

您正在超过itemSelector_.pItems末尾写入因为pItems是长度2的阵列,但你正在写3元件。

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

要么改变你的循环终止测试,要么增加pItems的长度。我无法分辨哪一个是正确的解决方案,但显然你会知道。

+0

OMG !!!!我怎么会这么愚蠢...... – 2012-04-28 13:52:19

+0

@Syhou - 犯这样的错误并不是“愚蠢的”,它只是人为的。 “愚蠢的”部分是如此注视你认为错误发生在哪里(更糟糕的是,错误是在系统代码中是“积极的”),而不是考虑错误可能的所有地方。 – 2012-04-30 01:40:13