
类:
class TB { public: TB() = default; ~TB() = default; int Initialize(); private: std::string socket_name = ""; }; 实现:
int TB::Initialize() { char *socket_name_buffer = new char[128]{}; snprintf(socket_name_buffer, 128, "External_%03d_%03d", 0, 0); std::string shell_socket_name = std::string(socket_name_buffer); // 上面这行在赋值时段错误,但如果直接 std::cout 不会段错误 delete[] socket_name_buffer; socket_name_buffer = nullptr; return 0; } gdb 输出(可以看见是挂在了 basic_string::assign()):
Thread 2 "transceiver" received signal SIGSEGV, Segmentation fault. std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign (this=<optimized out>, __str=...) at /usr/src/debug/gcc-runtime/7.3.0-r0/libstdc++-v3/include/bits/basic_string.h:1366 1366 /usr/src/debug/gcc-runtime/7.3.0-r0/libstdc++-v3/include/bits/basic_string.h: No such file or directory. (gdb) bt #0 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign (this=<optimized out>, __str=...) at /usr/src/debug/gcc-runtime/7.3.0-r0/libstdc++-v3/include/bits/basic_string.h:1366 #1 0x0006be94 in TB::Initialize ( this=0x44364 <std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_quantifier()+612>) at <路径缩写>/transceiver/src/TB.cpp:63 ......(后面还有很长的栈,没贴了) 问下这个有可能是啥奇怪的问题……
1 ysc3839 2021 年 7 月 12 日 via Android 说个题外话,C++17 开始 std::string 可以先用 resize()分配空间,然后用 data()获取数据指针直接写入。 另外,按照 https://stackoverflow.com/a/39200666 的说法,从 C++11 开始就可以 resize()后使用 &str[0] 直接写入。 |
2 chinuno 2021 年 7 月 12 日 via Android 你这段代码试了一下没有复现。应该是项目中其他地方越界之类破坏内存了导致这里挂掉。有没有试过单独写个 main 验证这个类的问题 格式化 string 推荐用 1L 的方法,或者可以看下 fmt 这个库 |
3 ipwx 2021 年 7 月 12 日 你省略掉的栈帧可能是问题的关键。 |
4 TaylorJack123 2021 年 7 月 12 日 via iPhone 不能给 std:string 变量初始化成“” |