2012-01-04 11 views
0

我有一個遊戲,剝離的問題,一個GameHandler類,一個遊戲類和一個網格類。對象似乎刪除本身或構造函數後更改內存

GameHandler類在其頭文件中聲明瞭一個Game對象。該GameHandler構造然後重新構建遊戲對象,所以

game = Game(); 

遊戲中有一個指針指向一個網格對象的聲明在它的頭文件。構造函數然後定義該Grid對象:然後我可以繼續玩遊戲直到最後(通過死亡或完成)。當我完成了比賽,GameHandler給了我重新開始的選擇,而要做到這一點,我想我會簡單地重新設置遊戲狀態,然後再次調用

game = Game(); 

。這並沒有抱怨,它似乎創建了一個新的遊戲對象,從而創建了一個新的網格。這次,在構建網格之後,使用VS2010並查看當地人,到網格開始更新或繪製時,網格中所有變量的位置都指向0xfeeefef2或類似的數據,即數據已根據幾次搜索在程序運行期間被刪除。這個被刪除的唯一地方是在遊戲的破壞者中。

因此,我現在的假設是我覆蓋了遊戲對象,然後我覆蓋的對象決定稱它爲析構函數,然後將網格清空,並將其留空。我真的沒有線索,所以任何見解都會很好。

+0

顯示你的測試用例。 – 2012-01-04 00:53:28

+0

請同時顯示您的副本構造函數,賦值運算符以及Game和Grid的析構函數。 – dasblinkenlight 2012-01-04 00:56:36

+0

這很可能是Lightness指出的複製構造函數問題。不過,我會建議,在這種情況下,您只需爲Game定義一個「重置」方法,然後調用該方法而不是創建新對象。我在這裏創建和複製Game對象時看不到任何價值。如果您真的想銷燬Game對象並創建一個新對象,請改用智能指針,以便不調用副本。 – Gerald 2012-01-04 01:14:25

回答

1

你忘了定義拷貝構造函數和賦值運算符,和你Game S的一個在其析構函數—所使用的其它Game是因爲指針被複制一個Grid破壞Grid


猜測:

class Game { 

    Grid* grid; 

    public: 
    Game(int x, int y, int z) : grid(0) { 
     grid = new Grid(x, y, z); 
    }; 

    ~Game() { 
     delete grid; 
    } 


    /* You forgot these: */ 

    Game(Game const& src) : grid(0) { 
     grid = new Grid(*(src.grid)); 
    } 

    Game& operator=(Game other) { 
     swap(other); 
     return *this; 
    } 

    void swap(Game& other) { 
     // swap all the members (and base subobject, if applicable) with other 
     std::swap(grid, other.grid); 
    } 
}; 
+1

完美的猜測。在3分鐘內解決頭痛幾個小時。 :-)謝謝 – AxNo 2012-01-04 01:09:05

+0

@AlexFurnell:沒問題。對於它的價值,我的豐富C++經驗在三分鐘之內就已經獲得。 :) – 2012-01-04 01:09:41