首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >STL容器的奇怪行为(构造/销毁和作用域)

STL容器的奇怪行为(构造/销毁和作用域)
EN

Stack Overflow用户
提问于 2013-02-11 23:21:51
回答 1查看 110关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
#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 ):

代码语言:javascript
代码运行次数:0
运行
复制
Entry00
~Entry00
Entry01
~Entry00
~Entry01
~Entry00
~Entry01
a.stuff[0] = applejack
~Entry00

a只有一个元素是预期的,这不是问题所在。最让我困惑的是,一个条目怎么会被多次销毁?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 23:27:01

您看到的是临时实例的破坏。

代码语言:javascript
代码运行次数:0
运行
复制
a.stuff.push_back(Entry(string("applejack")));

这一行创建一个临时实例,然后将其复制到容器中的另一个新实例。那么临时文件就会被销毁。删除条目或销毁容器时,销毁容器中的实例。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14815145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档