編輯:指針刪除崩潰
我已經實現了複製構造函數(都來自建議的答案)。我已經在我的控制器類中做了這個,以及它的子類中的等價版本。但是,這並沒有解決這個問題。此外,在removePawn()
函數(程序中唯一稱爲刪除的地方)中的計數器和控制檯註釋表明它只被調用一次。
更詳細地說,每個子類都有一個實例(不是指針)。這些在我的world
類中聲明。兩者都通過baseController
類指針在類方法world
中用作參數。問題是,雖然兩者都按照相同的順序進行相同的過程,但如果一個類調用了removePawn()
,那麼程序會很好,並且會持續運行。但是,如果第二類具有removePawn()
(特別刪除),它會在該指令處崩潰程序。
我也檢查過地址。分配後指針的地址與刪除點處的地址相同。
更多信息:當關閉程序時,如果玩家被殺死(刪除,然後給予一個新的棋子),我會得到一個分割錯誤。但是,如果程序啓動後關閉時沒有超過第一次刪除和最後一次刪除,那麼它運行得很好。
原創:
我對指針有點麻煩。我理解他們,並相信我的代碼是相當健壯的,但我似乎在調用這段代碼時完全崩潰。
Pawn是一個basePawn *,初始化爲NULL。
if (pawn != NULL)
{
cout << "Calling delete.\n";
delete pawn;
pawn = NULL;
}
這是PS2程序的大學作業,所以我的調試僅限於基本打印到控制檯。
刪除的刪除線允許主新/刪除部分跑了幾次但它最終也崩潰(我想這是因爲已達到內存限制,但是我不能肯定)
我有檢查了所有通常的罪魁禍首,指針被初始化爲空,並且只刪除一次(新也總是被調用)。
我可能會犯一個相當明顯的錯誤,但我不知道。任何建議都會很棒。 (如果需要,我可以發佈更多的代碼)。
編輯:
下面是代碼結構的工作原理。
basePawn是一個具有一些相當基本的方法來表示字符的類。
控制器是一個帶有指向basePawn(初始設置爲NULL)的指針的類,該指針用作角色的大腦(AI或玩家控制的)。它包含一個removePawn方法。
void controller::removePawn()
{
if (pawn != NULL)
{
cout << "Calling delete.\n";
delete pawn;
pawn = NULL;
}
}
該方法在析構函數中被調用。當棋子從關卡上移開時它也會被調用。
它也有重生方法。
if (pawn == NULL)
{
respawnCounter++;
if (respawnCounter >= respawnTime)
{
//Switch block to change class
pawn = new basePawn;
if (pawn !=NULL)
{
pawn->boardY = 4; //Will be random
pawn->boardX = 5; //Will be random
respawnCounter = 0;
pawn->setIdle();
return true;
}
}
}
編輯:
baseController頭文件
#ifndef _BASEPAWNCONTROLLER_H
#define _BASEPAWNCONTROLLER_H
#include "basePawn.h"
#include "textureManager.h"
#include "direction.h"
#include "vector2f.h"
//Used to control pawns
//Allows the same commands to be used to control different pawns
class basePawnController
{
private:
protected:
basePawn *pawn;
int respawnCounter,
respawnTime;
vector2f targetDest;
bool bMoving,
bTarget;
void removePawn();
public:
bool bFirstFrameDead;
basePawnController();
virtual ~basePawnController();
virtual void update();
basePawn *getPawn();
void setPawn(basePawn *p);
void setTarget(float x, float y);
direction getDir();
bool isMoving();
bool hasTarget();
virtual bool respawn();
virtual void render(textureManager &tManager);
virtual bool wantsPawn();
virtual void giveTargetInfo(direction d, int n);
};
#endif
你是如何分配/分配給'pawn'的?如果它是'pawn = new basePawn();',它不應該崩潰。'pawn =&some_object;'另一方面不會使它成爲'delete'的合適操作數。 – 2013-04-29 17:14:22
你能給我們一個最小的完整例子嗎? – Beta 2013-04-29 17:21:11
是pawn和basePawn的實現並進行一些清理的析構函數,如果它們是,你是否讓basePawn的析構函數變爲虛擬的? – 2013-04-29 17:23:09