立即作为参数传递的对象的生命周期是多少?
What is the lifetime of an object immediately passed as a parameter?
我有一些代码如下所示:
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()
的结果进行复制。 obj
引用的真实对象在local
对象构造完成时被销毁,具体是当makefoo()
returns 的匿名临时变量被销毁时。
我认为你很幸运它能在 gcc 下工作。也许 obj
引用 的对象 被销毁了,只有它的数据留在 RAM 中,程序似乎可以正常工作。也许 MSVC 是 "erased" obj
提到的 RAM,因此尝试使用它会很快失败。
我有一些代码如下所示:
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()
的结果进行复制。 obj
引用的真实对象在local
对象构造完成时被销毁,具体是当makefoo()
returns 的匿名临时变量被销毁时。
我认为你很幸运它能在 gcc 下工作。也许 obj
引用 的对象 被销毁了,只有它的数据留在 RAM 中,程序似乎可以正常工作。也许 MSVC 是 "erased" obj
提到的 RAM,因此尝试使用它会很快失败。