我用我当前的vector.push_back()方法得到了分段错误(我认为)。
以下是一些示例代码:
所以我有我的班级Zombie
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()浅层复制其新元素,为什么会出现seg错误?假设那我错了吗?
答案 0 :(得分:9)
您需要实现复制构造函数和赋值运算符。
zombies.push_back(newZombie);
在向量中推送newZombie
的副本。方法进入时,原始newZombie
将被销毁。而且我愿意在~Zombie()
中打赌delete image;
。
因为您没有合适的复制构造函数和赋值运算符,所有副本都将无效,因为它们将包含悬空指针。
始终遵循三条规则 - 如果您需要实现析构函数,还需要实现一个c-ctor和赋值运算符。