编辑:
我已经实现了复制构造函数(都来自建议的答案)。我已经在我的控制器类以及它的子类中的等效版本中做到了这一点。但是,这并没有解决问题。此外,函数中的计数器和控制台注释removePawn()
(程序中唯一调用 delete 的地方)表明它只被调用一次。
更详细地说,每个子类都有一个实例(不是指针)。这些是在我的world
课堂上声明的。两者都通过类指针用作相同world
类方法中的参数。baseController
问题是,虽然两者都以相同的顺序执行相同的进程,但如果一个类removePawn()
调用了它,则程序很好并且将继续运行。但是,如果第二个类removePawn()
(特别是删除)调用了它,它会在该指令处使程序崩溃。
我也查了地址。分配后指针的地址与删除点的地址相同。
更多信息:仅当玩家被杀死(删除然后给予新棋子)时,我才会在关闭程序时收到分段错误。但是,如果程序在第一次新删除和最后一次删除的情况下启动然后关闭,那么它运行得非常好。
原来的:
我在使用指针时遇到了一些麻烦。我理解他们并相信我的代码相当健壮,但是在调用这部分代码时我似乎完全崩溃了。
Pawn 是一个初始化为 NULL 的 basePawn*。
if (pawn != NULL)
{
cout << "Calling delete.\n";
delete pawn;
pawn = NULL;
}
这是 PS2 程序的大学作业,所以我的调试仅限于控制台的基本打印。
删除删除行允许主要的新建/删除部分运行几次,但它最终也会崩溃(我认为这是因为达到了内存限制,但我不能确定)
我检查了所有常见的罪魁祸首,指针被初始化为 null 并且只删除一次(也总是调用 new)。
我可能犯了一个相当明显的错误,但我不知道。任何建议都会很棒。(如果需要,我可以发布更多代码)。
编辑:
以下是代码结构的工作原理。
basePawn 是一个具有一些相当基本的方法来表示角色的类。
Controller 是一个类,其指针指向用作角色大脑(AI 或玩家控制)的 basePawn(最初设置为 NULL)。它包含一个 removePawn 方法。
void controller::removePawn()
{
if (pawn != NULL)
{
cout << "Calling delete.\n";
delete pawn;
pawn = NULL;
}
}
这个方法在析构函数中被调用。当pawn 从关卡中移除时,它也会被调用。
它还有一个重生方法。
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