今天写代码的时候一个项目中出现莫名其妙的bug,问题估计出现在库中,那个库也没有开源,只能看函数原型。 只能把部分可能有问题的语法拿出来复现了。
#include <iostream>
#include <codecvt>
#include <windows.h>
using namespace std;
struct Test {
string str = "123123123123123123123123123123123123123123123123123123123123123123123123";
string& return_str() {return this->str;}
};
string str2;
void function() {
Test A;
str2 = std::move(A.return_str()); //移动A.str
//str2 = A.return_str(); //拷贝str
A.str = "456456456456456456456456456456456456456456456456456456456456456456456456";
}
int main() {
function();
cout << str2;
return 0;
}
我是这样想的。function返回的时候,里面A发生析构,类内str也会析构,‘ cout << str2;’这句应该会崩溃才对。就算不崩溃,也应该输出456这一串才对,事实是输出123这一串
123123123123123123123123123123123123123123123123123123123123123123123123
C:\Users\asdf\source\repos\test_something\Release\test_something.exe (进程 47692)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
移动不会析构。
移动不是引用,str2 不会随着 A.str 而变化,他们是两个不同的东西,并不共享内存。移动只是(在可能的情况下)将 A.str 里“使用”的内存“移动”到了 str2 里。A.str 不在使用被移动走的内存。