C++ STL容器的怪异行为(构造/破坏和范围)
我不确定传递时STL容器是否完全复制。首先,它起作用了,所以flutrshy元素没有被添加,这很好。然后我想跟踪条目的构建和销毁C++ STL容器的怪异行为(构造/破坏和范围),c++,stl,scope,C++,Stl,Scope,我不确定传递时STL容器是否完全复制。首先,它起作用了,所以flutrshy元素没有被添加,这很好。然后我想跟踪条目的构建和销毁 #include <vector> #include <string> #include <cstdio> #include <cstdlib> using namespace std; int nextid = 0; class Entry { public: string data; int my
#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;
}
预期a只有一个元素,这不是问题所在。让我非常困惑的是,一个条目怎么会被销毁多次?您看到的是临时实例的销毁
a.stuff.push_back(Entry(string("applejack")));
此行创建一个临时实例,然后将其复制到容器中的另一个新实例。然后,临时文件被销毁。删除条目或销毁容器时,容器中的实例将被销毁。您看到的是临时实例的销毁
a.stuff.push_back(Entry(string("applejack")));
此行创建一个临时实例,然后将其复制到容器中的另一个新实例。然后,临时文件被销毁。删除条目或销毁容器时,容器中的实例将被销毁。调用复制构造函数get。您拥有的元素比您想象的多得多。@mkaes在对flutshy和ApplejackThe copy构造函数get调用时使用一些优化(如-O2?+1)时,它们会被优化掉吗。您拥有的元素比您想象的多得多。@mkaes在使用诸如-O2?+1之类的优化时,它们会被优化掉吗?+1用于flattershy和applejack谢谢,请随意想象我在笑:谢谢,请随意想象我在笑: