@H_502_8@
@H_502_8@
#include <iostream>#include <vector>using namespace std;vector<vector<int>> f() { return {{1},{2},{3},{4},{5}}; }int main(){ const auto& v = f(); cout << v[3][0] << endl;}
即,v的生存期延长到v const参考的生命周期.
事实上,根据valgrind的说法,这可以很好地用gcc和clang编译而且没有泄漏.@H_502_8@
但是,当我改变主要功能时:@H_502_8@
@H_502_8@
int main(){ const auto& v = f()[3]; cout << v[0] << endl;}
它仍然编译,但valgrind警告我函数的第二行中的无效读取,因为第一行中的内存是空闲的.@H_502_8@
这是符合标准的行为还是g(4.7.2)和clang(3.5.0-1~exp1)中的错误?@H_502_8@
如果它符合标准,对我来说似乎很奇怪……哦.@H_502_8@解决方法 除了代码之外,这里没有任何错误.
@H_502_8@
第一个示例有效,因为当您将f()的结果绑定到v时,可以延长该结果的生命周期.@H_502_8@
在第二个示例中,您不会将f()的结果绑定到任何内容,因此不会延长其生命周期.绑定到它的子对象将计数:@H_502_8@
@H_502_8@
[C++11: 12.2/5]:
The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except: [..]@H_502_8@
…但你没有这样做:你绑定到对象上调用成员函数(例如operator [])的结果,并且该结果不是向量的数据成员!@H_502_8@
(值得注意的是,如果你有一个std :: array而不是std :: vector,那么the code†绝对没问题,因为数组数据存储在本地,所以元素是子对象.)@H_502_8@
所以,你有一个悬浮引用f()的原始结果的逻辑元素,它已经超出了范围.@H_502_8@
†抱歉可怕的初始化器,但是,好吧,责怪C.@H_502_8@ 总结
以上是内存溢出为你收集整理的C – “最重要的const”不适用于表达式?全部内容,希望文章能够帮你解决C – “最重要的const”不适用于表达式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)