2012-06-04 38 views
3

我正在使用我當前的vector.push_back()方法獲得分段錯誤(我認爲)。用戶定義類型正確使用std :: 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()淺拷貝它的新元素,爲什麼會出現seg錯誤?假設我錯了嗎?

+0

我希望你認識到'image'是未初始化的垃圾。 –

+0

如何實現複製構造函數:http://en.wikipedia.org/wiki/Copy_constructor – 2012-06-04 20:09:48

+1

可能重複[什麼是三條規則?](http://stackoverflow.com/questions/4172722/what-is -the-rule-of-three) – fredoverflow

回答

9

您需要實現複製構造函數和賦值運算符。向量中的newZombie的副本。方法進入時,原始的newZombie被銷燬。我願意打賭,在~Zombie()你打電話delete image;

因爲您沒有合適的拷貝構造函數和賦值操作符,所有拷貝將無效,因爲它們將包含懸掛指針。

始終遵循規則三 - 如果需要實現析構函數,還需要實現c-ctor和賦值運算符。

+2

由於對象包含原始指針,它將需要*深*副本。或者更好的是使用'shared_ptr'。 –

+0

爲什麼編譯器不爲我們實現一個? – 2012-06-04 20:08:14

+2

@ 0A0D它做,但它做了一個淺拷貝。副本中的指針「圖像」指向與原始位置相同的位置。所以當原始的一個被破壞時,副本中的指針將懸空。 –