文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者: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
)。