3

現在のvector.push_back()メソッドでセグメンテーション違反が発生しています(私は思います)。

次にいくつかのサンプルコードを示します。

だから私は私のクラスのゾンビを持っています

class Zombie
{
    public:
       Zombie();
       ~Zombie();

       SDL_Surface* image;

       SDL_Rect box;

       bool dead;

   protected:

   private:
       // gets random coordinates around the screen
       SDL_Rect get_zombie_rect();
 };

コンストラクターは次のとおりです。

Zombie::Zombie()
   :
   dead(false),
   image(load_image("Player.png")),
   box(get_zombie_rect())
{

}

ゾンビには、create_new_zombie()という関数を使用してベクターを管理するためのハンドラークラスがあります。(ここに問題があります)

void Zombie_Manager::create_new_zombie()
{
   Zombie newZombie;
   zombies.push_back(newZombie);
}

これは、要素をベクトルに追加する正しい方法ですか?

ポインタを使用して動作するバージョンを取得することはできますが、これを実現するためのより簡単で正確な方法が必要です。

std :: vector.push_back()が新しい要素を浅くコピーすると、セグメンテーション違反が発生するのはなぜですか?私はそれを仮定するのは間違っていますか?

4

1 に答える 1

9

コピーコンストラクタと代入演算子を実装する必要があります。

zombies.push_back(newZombie);newZombieベクトル内ののコピーをプッシュします。メソッドが入ると、元のメソッドnewZombieは破棄されます。そして、私は~Zombie()あなたが電話することを喜んで賭けますdelete image;

適切なコピーコンストラクタと代入演算子がないため、ダングリングポインタが含まれるため、すべてのコピーが無効になります。

常に3つのルールに従ってください。デストラクタを実装する必要がある場合は、c-ctorと代入演算子も実装する必要があります。

于 2012-06-04T20:04:58.307 に答える