作为参数立即传递的对象的生命周期是多少?

时间:2015-04-16 02:46:43

标签: c++ memory reference lifetime object-lifetime

我有一些代码如下所示:

struct fooclass {
    char data[32];
}

fooclass makefoo() {
    fooclass res;
    // for example:
    memset(res.data, 0, sizeof(res.data));
    res.data[0] = 43;
    return res;
}

struct do_stuff {
    const fooclass& obj;
    do_stuff(const fooclass& obj_in) : obj(obj_in) { }

    void operate() { /* do things with obj; */ }
}

bool put_it_to_work(struct do_stuff& f) {
    f.operate();
    f.operate();
    return true;
}

bool call_it_all() {
    do_stuff local(makefoo());
    return put_it_to_work(local);
}

使用gcc,代码运行良好。使用MSVC2012,local.obj已损坏。

问题是:fooclass返回的makefoo持续多久了?应该是call_it_all结束,还是直到do_stuff local(makefoo())行结束,我才幸运?我很欣赏这个标准的参考。

1 个答案:

答案 0 :(得分:4)

这是你的问题:

struct do_stuff {
    const fooclass& obj;

obj是一个引用,而不是一个正确的对象,因此不会复制makefoo()的结果。当obj对象完成构造时,local引用的真实对象被破坏,特别是当makefoo()返回的匿名临时变量被销毁时。

我认为你很幸运,它在gcc下工作。也许obj引用的对象被破坏的对象应该是,只有它的数据留在RAM中并且程序似乎正常工作。也许MSVC已被删除" obj提到的RAM,试图使用它会很快失败。