2012-04-28 88 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