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
只有一個元素的預期,這是不這個問題。什麼讓我非常困惑的是,一個條目如何被破壞多次?
複製構造函數get的調用。你有比你想象的要多得多的元素。 – mkaes 2013-02-11 15:25:33
@mkaes當使用像'-O2'這樣的優化時,它們會被優化嗎? – user2036212 2013-02-11 15:58:44
Fluttershy和Applejack的+1 – Jordan 2013-04-30 05:50:26