我发现了一个有趣的问题,但我不确定原因。这是我的代码:
#include<vector>
#include<iostream>
using namespace std;
std::vector<int>&& fun_1()
{
std::vector<int> v{ 1, 2, 3 };
return std::move(v);
}
std::vector<int>&& fun_2()
{
std::vector<int> v(3, 2);
return std::move(v);
}
int main() {
//std::vector<int> v1 = fun_1();
std::vector<int> v2 = fun_2(); //why isn't move-constructor called?
//out << v1.data() << endl;//0x00
cout << v2.data() << endl;//0x00
}
我有两个问题。
首先,为什么 v1.data() 和 v2.data() 都返回零指针?我原本期望调用 std::vector 的移动构造函数,但似乎没有调用。
其次,当我取消主函数中第一行的注释时,函数退出时会引发内存错误。它似乎是在删除与 v1 相关的某些对象时发生的。我正在 Visual Studio 2022 环境中工作。
有人可以向我解释这两个问题吗?
在
fun_1
和 fun_2
中,您都将 悬空引用 返回到局部变量。
取消引用它会调用 UB(未定义的行为)。这意味着该标准不保证程序的行为。
如果您启用编译器警告,您的编译器应该就此向您发出警告。
MSVC 问题:
warning C4172: returning address of local variable or temporary : v
海湾合作委员会问题:
warning: reference to local variable 'v' returned
叮当声问题:
warning: reference to stack memory associated with local variable 'v' returned