2013-02-11 41 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