作为参数立即传递的对象生存期是多少
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()
的结果。当local
对象完成构造时,特别是当makefoo()
返回的匿名临时变量被销毁时,obj
引用的真实对象将被销毁。
我认为你很幸运,它在 gcc 下工作。也许obj
提到的对象正在被销毁,只有它的数据留在 RAM 中并且程序似乎正常工作。也许MSVC被"擦除"了obj
提到的RAM,因此使用它的尝试会很快失败。
相关文章:
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- QML QQmlPropertyList - 包含的对象生存期和'memory rules'
- 从“if constexpr”分支扩展对象生存期/范围
- 成员重新值引用和对象生存期
- 对象生存期,在这种情况下重用存储
- C++对象生存期优化
- 基于范围的 for 循环的对象生存期问题
- 使用对象生存期运行线程
- C++ Boost.Asio 对象生存期
- 作为参数立即传递的对象生存期是多少
- 智能指针列表-管理对象生存期和指针有效性
- C++标准关于对象生存期的含义是什么
- 如何在 C++11 lambda 中跟踪对象生存期
- C/C++严格的别名、对象生存期和现代编译器
- 如何使用静态强制转换管理共享对象生存期
- 调用了C++对象生存期和析构函数
- 对象生存期内显式构造函数和虚函数调用
- 目标C "autorelease" C++ -- 控制对象生存期的标准方法?
- 具有移动操作和重新值转发的对象生存期