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

What is the lifetime of an object immediately passed as a parameter?

本文关键字:对象 生存期 多少 参数      更新时间:2023-10-16

我有一些代码看起来像下面这样:

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变得腐败。

问题是:makefoo返回的fooclass能持续多久?应该直到call_it_all结束,还是直到do_stuff local(makefoo())线结束而我只是幸运?我希望参考该标准。

这是你的问题:

struct do_stuff {
    const fooclass& obj;

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

我认为你很幸运,它在 gcc 下工作。也许obj提到的对象正在被销毁,只有它的数据留在 RAM 中并且程序似乎正常工作。也许MSVC被"擦除"了obj提到的RAM,因此使用它的尝试会很快失败。