0

編集:

コピーコンストラクターを実装しました(両方とも提案された回答から)。私はこれをコントローラークラスで行い、そのサブクラスで同等のバージョンを作成しました。ただし、これで問題は解決していません。また、関数内のカウンターとコンソール コメント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
4

2 に答える 2

0

まあ、あなたたちはほとんど正しかった。

コピー コンストラクターと代入演算子を追加した後、実際に問題が発生している場所を確認するためにさらにチェックを実行しました。コントローラ クラスとは直接関係がなく、ポーン クラスとワールド クラスが関係していたことがわかりました。

私のポーンには、削除していない DamageNode* のベクトルがあります。私は世界でそれらへのポインタを持っていたので、大きな問題ではありません. しかし、ワールドクラスでもそれらを削除したことはありません。そのため、ポーンとワールドを削除するときにセグフォルトが発生していました。

于 2013-05-02T10:59:11.483 に答える