2013-02-11 64 views
2

我不確定STL容器是否在傳遞時被完全複製。首先,它有效(所以「fluttershy」元素沒有被添加,這很好)。然後,我想跟蹤建設和項目的破壞....STL容器的奇怪行爲(構造/銷燬和範圍)

#include <vector> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 
using namespace std; 

int nextid = 0; 

class Entry { 
public: 
    string data; 
    int myid; 
    Entry(string in) { 
     data = in; 
     myid = nextid; 
     nextid++; 
     printf("Entry%02d\n", myid); 
    } 
    ~Entry() { printf("~Entry%02d\n", myid); } 
}; 

class Meep { 
public: 
    vector<Entry> stuff; 
}; 

void think(Meep m) { 
    m.stuff.push_back(Entry(string("fluttershy"))); 
} 

int main() { 

    Meep a; 
    a.stuff.push_back(Entry(string("applejack"))); 
    think(a); 
    vector<Entry>::iterator it; 
    int i = 0; 
    for (it=a.stuff.begin(); it!=a.stuff.end(); it++) { 
     printf("a.stuff[%d] = %s\n", i, (*it).data.c_str()); 
     i++; 
    } 

    return 0; 
} 

產生下列意外輸出(http://ideone.com/FK2Pbp):

Entry00 
~Entry00 
Entry01 
~Entry00 
~Entry01 
~Entry00 
~Entry01 
a.stuff[0] = applejack 
~Entry00 

a只有一個元素的預期,這是不這個問題。什麼讓我非常困惑的是,一個條目如何被破壞多次?

+2

複製構造函數get的調用。你有比你想象的要多得多的元素。 – mkaes 2013-02-11 15:25:33

+0

@mkaes當使用像'-O2'這樣的優化時,它們會被優化嗎? – user2036212 2013-02-11 15:58:44

+0

Fluttershy和Applejack的+1 – Jordan 2013-04-30 05:50:26

回答

4

你看到的是對臨時實例的破壞。

a.stuff.push_back(Entry(string("applejack"))); 

這行創建一個臨時的實例,然後將其複製到另一容器新實例。然後臨時銷燬。當條目被刪除或容器被銷燬時,容器中的實例被銷燬。

+0

謝謝,隨時想象我微笑:) – user2036212 2013-02-11 15:37:25