我有一些代码如下所示:
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())
行结束,我才幸运?我很欣赏这个标准的参考。
答案 0 :(得分:4)
这是你的问题:
struct do_stuff {
const fooclass& obj;
obj
是一个引用,而不是一个正确的对象,因此不会复制makefoo()
的结果。当obj
对象完成构造时,local
引用的真实对象被破坏,特别是当makefoo()
返回的匿名临时变量被销毁时。
我认为你很幸运,它在gcc下工作。也许obj
引用的对象被破坏的对象应该是,只有它的数据留在RAM中并且程序似乎正常工作。也许MSVC已被删除" obj
提到的RAM,试图使用它会很快失败。