2010-03-20 112 views
1

我正在嘗試學習C++,但我遇到了下面的代碼問題。讀/寫保護的內存?

class Vector2 
{ 
public: 
    double X; 
    double Y; 

    Vector2(double X, double Y) 
    { 
     this->X = X; 
     this->Y = Y; 
    }; 

    SDL_Rect * getSdlOffset() 
    { 
     SDL_Rect * offset = new SDL_Rect(); 
     offset->x = this->X; 
     offset->y = this->Y; 
     return offset; 
    }; 
}; 

Visual Studio中拋出調用getSdlOffset時拋出了以下錯誤()

類型的未處理的異常 'System.AccessViolationException' 發生在crossEchoTest.exe

其他信息:試圖以 讀取或寫入受保護的內存。此 通常表示其他 內存已損壞。

我有一個C#/ java背景,我迷路了...任何幫助將不勝感激。

回答

2

你從來沒有初始化X或Y ...這些值可能是什麼?更可能他們指向00000X00(我生鏽這可能不是正確的地址,但你指向的內存以外的程序分配空間...因此,「GPF」我是C/C++「轉換」爲Java (超過11年前),所以我可以欣賞你的指針可能如何表現的想法 - 我可以向你保證指針是C/C++最難理解的部分,所以你在學習中處於正確的軌道。請記住,與Java/C#不同,C/C++不會讓你不會傷害到自己或其他程序的操作系統內存空間/內存空間,我一直記得當我學習C時老師曾經告訴過我什麼 - 「With C你會得到一個凱夫拉靴和一把槍,這取決於你是否把之前的靴子放在之前,因爲你在處會拍到你自己的某個點......「祝你好運在學習C++的時候,只要呆在那裏,就不要放棄中年。

WM

+0

你是對的!我有一個這個Vector2類的實例沒有被初始化。 感謝您指點我正確的方向! – PenguinBoy 2010-03-20 04:28:10

0

很確定Wintermute是正確的。還有另一個SO問題得到了一些很好的答案。您可能要在那裏看看剛拿到什麼回事一些背景:

AccessViolationException in Release mode (C++)

希望它能幫助!

+0

是的,他是對的!我沒有正確創建Vector2類的一個實例。 – PenguinBoy 2010-03-20 04:28:55

0

哎呀,語言混亂,對我來說沒有這麼困的時候。

+3

'this'是C++中的一個指針。 – indiv 2010-03-20 04:29:49

0

真的只有兩件事情可以在該功能出錯,要麼this是壞的或offset是壞的。既然你從new SDL_Rect();得到offsetoffset可能是一個糟糕的指針的唯一方法是如果新失敗但不拋出,這看起來不太可能。

因此我們推斷this是不好的。既然你永遠不會顯示你用來分配的代碼,我會猜測你的代碼看起來像這樣。

Vector2 * vec; 
    vec->getSdlOffset(); // you crash here 

您需要向我們展示的代碼,你如果你會告訴我們,你創建Vector2對象,我們也許可以更具體

相關問題