C++ 返回右值不起作用并且出现段错误[重复]

问题描述 投票:0回答:1

我有一个函数可以创建一个向量,用它做一些事情,然后使用 std::move 将其作为

rvalue
返回。 当我将它分配给变量时,我期望调用
std::vector
的移动构造函数
std::vector::vector(vector&&)
。 但我遇到了分段错误。

这是我的代码:

#include <iostream>
#include <vector>

std::vector<int>&& getVector(int start)
{
    auto result = std::vector<int>();
    result.reserve(10);
    for (int i = start; i < start + 10; i++)
        result.push_back(i);
    return std::move(result);
}

int main()
{
    std::cout << "Did I break here 1" << std::endl;
    auto vec = getVector(10);
    std::cout << "Did I break here 2" << std::endl;
}

它给了我

Did I break here 1
[1]    55419 segmentation fault <executable_file>

我只是猜测移动构造函数或右值有问题。顺便说一句,我返回一个右值,以不复制向量的值并窃取指向它的指针。

c++ c++11 vector segmentation-fault
1个回答
0
投票

您正在返回对局部变量的引用

result
。该对象在函数返回之前被销毁,然后您尝试从悬空引用移动构造
vec

您不需要在

std::move
语句中显式返回右值引用或
return
来获取移动语义。你应该做直接的事情:

std::vector<int> getVector(int start)
{
    auto result = std::vector<int>();
    //...
    return result;
}

//...

auto vec = getVector(10);

现在

vec
将从
result
移动构造,甚至可以省略构造函数调用。在 C++17 之前,如果编译器未进行优化,可能会有 3 个(包括
= std::vector<int>()
)移动构造函数调用。从 C++17 开始,最多只有一个。无论如何,不会有任何复制构造函数调用。

© www.soinside.com 2019 - 2024. All rights reserved.