我有一个函数可以创建一个向量,用它做一些事情,然后使用 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>
我只是猜测移动构造函数或右值有问题。顺便说一句,我返回一个右值,以不复制向量的值并窃取指向它的指针。
您正在返回对局部变量的引用
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 开始,最多只有一个。无论如何,不会有任何复制构造函数调用。