in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

操作描述:
  本地交叉编译环境中编译好的 ARM64 程序烧录到板子中执行,出现了如下错误。

报错描述:

(gdb) bt
#0  0x0000007fbf35614c in ?? () from /lib/libc.so.6
#1  0x0000007fbf61ddec in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) () from /usr/lib/libstdc++.so.6
#2  0x000000000040649c in s2s::SamplePlugin::DealPlgunData (this=0x42d030) at /data/Integration/3J3/autodrive-s2s-sdk/sample/src/sample_plugin.cpp:146
#3  0x0000000000406090 in s2s::SamplePlugin::Run (this=0x42d030) at /data/Integration/3J3/autodrive-s2s-sdk/sample/src/sample_plugin.cpp:86
#4  0x00000000004023f8 in main (argc=1, argv=0x7ffffffc28) at /data/Integration/3J3/autodrive-s2s-sdk/sample/src/main.cpp:70

#include <stdio.h>
#include <string>

class Base {
public:
  Base() {}
  ~Base()

  // 正确写法: 
  //std::string const GetType() noexcept {
  //错误写法:
  std::string GetType() const noexcept {
  	return type_;
  }

private:
  std::string type_;
};

struct stu_Data
{
  std::string type;
  std::string name;
};

int mian(int argc, char* argv[]) 
{
  Base base;
  stu_Data stu;
  memset(&stu, '\0', sizeof(stu_Data)); 
  stu.type = base.GetType();  // 这里崩掉了
  stu.name = "Aliven";
  return 0;
}

问题分析:

  在 #1 处,0x0000007fbf61ddec in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std: :char_traits<char>, std::allocator<char> >&&) () from /usr/lib/libstdc++.so.6 赋值操作 ‘=’ 前后的函数体不一样。这是由软件编译环境中的 gcc 版本 和 运行环境的 gcc 版本不一致导致的。因为后面的赋值其实是取地址 &&,所以在返回 const 时会报错。

解决方案:

方案一:统一 gcc 的版本库。
方案二:不要使用 const 类型限制函数 (函数改为: std::string const GetType() noexcept)。