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

41 篇文章 6 订阅

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


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值