編集:
コピーコンストラクターを実装しました(両方とも提案された回答から)。私はこれをコントローラークラスで行い、そのサブクラスで同等のバージョンを作成しました。ただし、これで問題は解決していません。また、関数内のカウンターとコンソール コメントremovePawn()
(delete が呼び出されるプログラム内の唯一の場所) は、一度だけ呼び出されることを示しています。
より詳細には、各サブクラス (ポインターではない) のインスタンスが 1 つあります。これらは私のworld
クラスで宣言されています。両方とも、クラス ポインターを介して同じworld
クラス メソッドのパラメーターとして使用されます。baseController
問題は、両方が同じプロセスを同じ順序で通過している間、一方のクラスがそれをremovePawn()
呼び出した場合、プログラムは問題なく継続的に実行されることです。ただし、2 番目のクラスが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;
}
}
このメソッドはデストラクタで呼び出されます。また、ポーンがレベルから削除されたときにも呼び出されます。
また、respawn メソッドもあります。
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