2012-06-23 36 views
6

我正在閱讀C++ Primer,3rd Ed(Lippman and Lajoie),它的意思是當一個向量需要重新分配以便爲更多元素增加空間時使用push_back(),這些元素在新空間中複製構建,然後在舊元素上調用析構函數。我很困惑爲什麼這是必要的 - 爲什麼數據不能被複制一點點?我假設答案與動態內存分配有關,但我目前的理由是,即使向量元素處理動態內存,實際存儲在元素中的數據也將是指針,這意味着逐位複製將保留它們指向的位置並且不會出現任何問題。我可以看到如何重新定位元素指向的動態分配內存會是一個問題,因爲它會使指針無效,但據我所知,向量重新定位沒有理由這樣做。C++:自動向量重新分配調用複製構造函數?爲什麼?

有人可以給我一個簡單的例子,不應該一個一個地移動一個類?

+2

構想函數/析構函數注意/註銷具有父對象的類的地址的情況出現了。 –

+1

想到類型不是_trivially copyable_的場景。 –

+1

ta.spot.is有一個很好的例子,但我不會將每個對象註冊表都稱爲「父級」。另外,有些類可能會保留指向自己數據成員的指針 - 例如,模擬某種模態狀態,並指出某些未來操作現在應該影響該特定成員,或者將迭代器放入內部向量中。 –

回答

7

這裏有可能是最簡單的(但虛構的)例子:

class foo 
{ 
    int i; 
    int* pi; // always points to i 
}; 

這裏,拷貝構造函數將保持不變即pii。編譯器本身無法自己找出這種關係,因此需要調用複製構造函數。

4

有人可以給我一個簡單的例子,不應該一個一個地移動一個類嗎?

通過的標準,做一個memcpy任何類不是a POD in C++03 (or trivially copyable in C++11)有資格。非POD(或非平凡可複製的)調用未定義的行爲;因此必須使用實際副本(或在C++ 11中移動)構造函數必須使用

所以std::vector本身適用,因爲它不是一個POD類型(和在C + + 11中,它不是普通可複製的)。

相關問題