Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL容器的怪异行为(构造/破坏和范围)_C++_Stl_Scope - Fatal编程技术网

C++ STL容器的怪异行为(构造/破坏和范围)

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

我不确定传递时STL容器是否完全复制。首先,它起作用了,所以flutrshy元素没有被添加,这很好。然后我想跟踪条目的构建和销毁

#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谢谢,请随意想象我在笑:谢谢,请随意想象我在笑: