2014-01-10 61 views
0

當我的角色獲勝或失去遊戲時,我正在切換場景。我收到一條消息,指出釋放的指針未分配。改變場景時遊戲崩潰,指針被釋放不被分配

有時,遊戲不會崩潰,它會返回到遊戲視圖。但有時遊戲在這條線上主要崩潰:

int retVal = UIApplicationMain(argc, argv, nil, @"AppController"); 

錯誤是「不良訪問」;

cocos2d::CCDirector::sharedDirector()->replaceScene(GameWon::scene()); 

然後在GameWon.cpp我創建了一個新的遊戲場景,開始一個新的遊戲:

cocos2d::CCDirector::sharedDirector()->replaceScene(Controller::scene()); 

不知道是什麼原因導致

我使用CCdirector切換到結束屏幕這個問題。奇怪的是,它並不總是在模擬器上崩潰。有小費嗎?

編輯

於是我發現了什麼問題,我只是不知道爲什麼這是一個問題。顯然,當我創建一個新場景時,我的控制器的析構函數被調用。在這個析構函數中,我釋放了我的模型對象:

Controller::~Controller() 
{ 
    free(pModel); 
} 

當我沒有釋放模型對象時,它就像一個魅力。然而,在我的構造函數初始化我這樣做:

pModel = Model::create(); 

所以我不知道爲什麼pModel將是被釋放的指針,而不是分配呢?

回答

0

我的猜測是你沒有保留保留你的pModel對象。創建函數通常會自動釋放對象,如果不保留它,在析構函數中調用「free(pModel)」時它將被刪除。

0

您不需要在析構函數中手動釋放pModel對象,就像在create函數中創建的對象被添加到autorelease pool一樣。因此,這裏發生的第一件事情是,自動釋放池自動釋放它時會自動釋放分配給pModel的內存。當控制器的析構函數被調用時,free(pModel);會嘗試釋放已釋放的內存。

0

當您替換場景時,將調用前一場景的析構函數。如果釋放使用cocos的create()函數創建的對象,因爲它已經添加到由cocos管理的autorelease池中,池會嘗試釋放(刪除)已經刪除(使用免費的析構函數)指針。所以,不要使用手動刪除來創建使用create函數創建的cocos對象。

相關問題