gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:49:03 25 4
gpt4 key购买 nike

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

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() 返回的匿名临时变量是销毁。

我认为你很幸运它能在 gcc 下工作。也许 obj 引用的对象 正在 被销毁,因为它应该被销毁,只有它的数据留在 RAM 中,程序似乎可以正常工作。也许 MSVC 被“删除”了 obj 引用的 RAM,因此尝试使用它很快就会失败。

关于c++ - 立即作为参数传递的对象的生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com