2010-02-13 59 views
1

後,我選擇調試它在MVS2010請查看墜毀的這一形象: http://i48.tinypic.com/dr8q9u.jpg寫入類指針給了我一個訪問衝突錯誤

這裏的Game.h頭,顯示了遊戲類結構,在圖片中,您將看到導致訪問衝突的違規方法(setBot(botInfo * b))。

class botInfo; // Forward declaration 

class Game { 
int gameState; 
int flagDropTime; 
botInfo * bot; 
public: 
Game(); 
~Game(void); 
void startGame(); 
void gameOver(int victoriousTeam); 
void resetBall(); 
void hideBall(); 
int getState(); 

void setBot(botInfo * bot); 
botInfo * getBot(); 
}; 

從botInfo(另一個類)我打電話與該碼的函數的一個實例, (遊戲_dsbTrench是botInfo實例的成員變量)。

botInfo * botPointer = this; 
_dsbTrench->setBot(botPointer); 

問題是,每當我把這種導致異常:在MERVBot.exe在0x72332569(PubBot.dll) 未處理的異常:0000005:訪問衝突寫入位置0xcdcdcdd5。

那麼這個錯誤是什麼原因?我該如何解決它?

謝謝。

回答

0

我不認爲有足夠的信息可以幫助我。但是我會努力的。

您正在寫入未由操作系統分配給您的程序的內存 - 您在寫入內容之前需要分配內存。

  1. 您不應該將此參數傳遞給其他函數 - 您的偏移量計算可能是關閉的 - 您不能使用參考嗎? 。
  2. 你爲dsbtrench分配了內存嗎?

- 編輯 -

作爲由其它的答案中提到 「0xCDCDCDCD」 是用於初始化字的前哨變量。

+0

我沒有爲_dsbTrench分配的內存,我剛剛宣佈它使用遊戲_dsbTrench。我不熟悉C++和C++中的類,但是我認爲我曾經聲明類的構造函數會自動調用? – Weasal 2010-02-13 15:08:53

+0

如果聲明沒有提供參數,它的默認構造函數會自動調用,是的。提供的課程沒有構造函數 - 或者如果構造函數的構造函數不是由您指定的默認構造函數,就是默認的加上其他構造函數。 – 2010-02-13 15:12:33

+0

是的,解決了這個問題。我宣佈_dsbTrench = new Game();在使用_dsbTrench-> setBot()之前,它工作。謝謝 – Weasal 2010-02-13 15:15:22

0

您是否調試過該代碼?當你爲它調用setBot方法時,似乎_dsbTrench爲null。只要你知道你在做什麼就可以傳遞「this」指針:)

+0

_dsbTrench不爲NULL,它是0xCDCDCDCD。 – 2010-02-13 15:22:10

+0

並且這是我的答案是-1的原因? sheeesh ... – grapkulec 2010-02-13 15:40:25

2

0xCDCDCDCD是MS C運行時用來填充新分配的內存的標誌值。在你的「_dsbTrench-> setBot(botPointer);」中,_dsbTrench是0xCDCDCDCD--這顯然是一個假指針。你有可能忘記初始化該變量。

+0

+1刪除我的答案,因爲它是一個重複的(你的答案比我的更好) – zebrabox 2010-02-13 15:30:18