我正在用c ++测试一些指针。我的代码如下所示:
#include <iostream>
#include <vector>
using namespace std;
vector <int>& vec_return(){
vector<int> test_vec;
test_vec.push_back(1);
test_vec.push_back(2);
test_vec.push_back(3);
test_vec.push_back(4);
test_vec.push_back(5);
return test_vec;
}
int main(){
vector <int>& test_vec = vec_return();
for(int i = 0; i < test_vec.size(); i++){
cout<<test_vec[i];
}
return 0;
}
我认为vec_return()函数应返回test_vec的指针,然后在main中应该打印,但它不会做任何事情。有什么建议吗?
答案 0 :(得分:1)
返回对堆栈变量的引用是未定义的行为:您在vec_return
中创建一个变量,它在退出此函数之前被销毁,但您仍然在main
中保留对它的引用。将vec_return()
的签名更改为vector<int> vec_return()
,以便编译器可以执行copy elision并确保该对象仅构造一次。
此外,最好在test_vec.reserve(N);
中调用vec_return
,然后再将任何内容推入预先分配内存,其中N
是push_back
的预期调用次数vector<int> test_vec{1, 2, 3, 4, 5}
1}},或者(从C ++ 11开始)直接初始化它:posts
id - integer
name - string
videos
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
。
答案 1 :(得分:0)
此函数将引用返回到临时对象
main()
因此在private AppointmentUrlGet = 'http://localhost:8080/datas'
.
.
.
getDataByYear(): Promise<UserData[]> {
var body ="?fromDate=01-01-" + this.yearOfToday +"&toDate=31-12-
" + this.yearOfToday +"&limit=100";
var urlByYear = this.AppointmentUrlGet+body
return this.http.get(urlByYear)
.toPromise()
.then(response => this.parseUserData(response))
.catch(this.handleError);
}
中使用此函数的结果是未定义的行为。
答案 2 :(得分:0)
返回对局部变量的引用会导致悬空引用即,即对未分配数据的引用,即UB。
std::vector<int>& vec_return() {
std::vector<int> test_vec; // Create local object.
/* ... */
return test_vec; // Return reference to local object.
} // Here all local objects are destroyed.
相反,按值返回。任何体面的编译器都会忽略(优化掉)副本。从C ++ 11开始,如果没有可用的优化,标准甚至可以保证在调用站点的移动构造†。
std::vector<int> vec_return() {
return {1, 2, 3, 4, 5};
}
† C ++ 17标准(已完成但未发布ISO)甚至保证 NRVO优化。