问一个c++移动语义相关问题?

今天写代码的时候一个项目中出现莫名其妙的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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
阅读 1.4k
1 个回答

移动不会析构。

移动不是引用,str2 不会随着 A.str 而变化,他们是两个不同的东西,并不共享内存。移动只是(在可能的情况下)将 A.str 里“使用”的内存“移动”到了 str2 里。A.str 不在使用被移动走的内存。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题