BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #101412同步于 2021/11/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请问这段代码有什么问题(找到问题了,应该是函数返回类型的问题

Libertas
2021/11/12镜像同步10 回复
#include <iostream> #include <vector> using namespace std; vector<int>&& f(int i) { vector<int> a = vector<int>(); a.push_back(i); return move(a); } int main() { vector<int> &&a = vector<int>(); for(int i = 0; i < 10; i++) { a = f(i); } cout<<a.at(0)<<endl; return 0; } 没有报错,在我电脑上是死循环 ······································· 这样就没错啦 #include <iostream> #include <vector> using namespace std; vector<int> f(int i) { vector<int> b = vector<int>(); b.push_back(i); return move(b); } int main() { vector<int> &&a = vector<int>(); for(int i = 0; i < 10; i++) { a = f(i); // cout<<i<<endl; } cout<<a.at(0)<<endl; return 0; } 我的理解是,函数的返回类型不能是引用,否则引用的对象都被销毁了,再引用它就是有问题的啦。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Hogwarts机器人#1 · 2021/11/12
不是,向量a没看懂怎么来的[ema1]new?
lukeayin机器人#2 · 2021/11/12
a怎么传到函数里的[ema19]
huangsiyuan机器人#3 · 2021/11/12
a = f(i); 这个a是右值引用变量,变量a其实还是左值,然后把右值赋值给左值非法吧,我也不确定,没太整明白
Libertas机器人#4 · 2021/11/12
并没有报错,在我电脑上是死循环 【 在 huangsiyuan 的大作中提到: 】 : a = f(i); : 这个a是右值引用变量,变量a其实还是左值,然后把右值赋值给左值非法吧,我也不确定,没太整明白
Wizmann机器人#5 · 2021/11/12
`f`函数里面的`vector<int> a`在返回时已经被析构了,引用约等于一个野指针。
wedfcvbn机器人#6 · 2021/11/12
f里的a是在栈上吧
cheng1997机器人#7 · 2021/11/12
好久没写c,但是既然死循环,那就print i看看呗,死循环应该和i值有关吧。然后再考虑考虑哪里会改变i值。
cnnc1994机器人#8 · 2021/11/13
应该不是死循环,函数f返回一个右值,但main函数里的a是另一个右值,应该会地址冲突才对
Vinci17机器人#9 · 2021/11/13
```C\C++ > cat test.cc #include <iostream> #include <vector> using namespace std; vector<int>&& f(int i) { vector<int> a = vector<int>(); a.push_back(i); return move(a); } int main() { vector<int> &&a = vector<int>(); for(int i = 0; i < 10; i++) { a = f(i); } cout<<a.at(0)<<endl; return 0; } > g++-11 -std=c++2b test.cc -Wall -g -o main; ./main test.cc: In function 'std::vector<int>&& f(int)': test.cc:8:16: warning: reference to local variable 'a' returned [-Wreturn-local-addr] 8 | return move(a); | ~~~~^~~ test.cc:6:17: note: declared here 6 | vector<int> a = vector<int>(); | ^ [1] 58251 segmentation fault ./main ```