2012-12-21 63 views
1

代碼:爲什麼這個程序有這種行爲(push_back)?

// test2.cpp 

#include <vector> 
#include <iostream> 

struct test_class 
{ 
    test_class() = default; 

    test_class(const test_class& t) 
    { 
     std::cout << "Copied" << std::endl; 
    } 
}; 

int main() 
{ 
    test_class a; 
    std::vector<test_class> v; 

    for (int i = 0; i < 5; ++i) { 
     v.push_back(a); 
     std::cout << std::endl; 
    } 
} 

行爲:

$ g++ --version | grep g++ 
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 
$ g++ -std=c++11 test2.cpp 
$ ./a.out 
Copied 

Copied 
Copied 

Copied 
Copied 
Copied 

Copied 

Copied 
Copied 
Copied 
Copied 
Copied 

每個push_back執行拷貝的 「未定義」 數目(其中,必須執行僅一個副本)。

這是怎麼回事?

回答

3

矢量像數組一樣分配連續內存。如果內存末尾沒有更多空間,則必須重新分配整個向量。在此之後,它將從舊地點複製到新地點並刪除舊地點。

可以初始化它能夠容納至少5個元素,所以西港島線是沒有內存分配,並在你的榜樣複製:

std::vector<test_class> v(5); 
+0

您的代碼將創建長度爲5的載體,沒有能力5。 – Quentin

1

A push_back可能會導致vector增長超出其分配的存儲,這會導致重新分配,這會導致內容被複制。