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())
{

}

Zombie 有一个处理程序类,通过一个名为 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;

因为您没有适当的复制构造函数和赋值运算符,所以所有副本都将无效,因为它们将包含悬空指针。

始终遵循三规则- 如果您需要实现析构函数,则还需要实现 c-ctor 和赋值运算符。

于 2012-06-04T20:04:58.307 回答