在c ++中返回向量的指针并不起作用

时间:2017-08-10 08:10:26

标签: c++ pointers vector

我正在用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中应该打印,但它不会做任何事情。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

返回对堆栈变量的引用是未定义的行为:您在vec_return中创建一个变量,它在退出此函数之前被销毁,但您仍然在main中保留对它的引用。将vec_return()的签名更改为vector<int> vec_return(),以便编译器可以执行copy elision并确保该对象仅构造一次。

此外,最好在test_vec.reserve(N);中调用vec_return,然后再将任何内容推入预先分配内存,其中Npush_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优化。