类:
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-07-12 08:32:35 +08:00 via Android
说个题外话,C++17 开始 std::string 可以先用 resize()分配空间,然后用 data()获取数据指针直接写入。
另外,按照 https://stackoverflow.com/a/39200666 的说法,从 C++11 开始就可以 resize()后使用 &str[0] 直接写入。 |
2
chinuno 2021-07-12 08:53:36 +08:00 via Android 3
你这段代码试了一下没有复现。应该是项目中其他地方越界之类破坏内存了导致这里挂掉。有没有试过单独写个 main 验证这个类的问题
格式化 string 推荐用 1L 的方法,或者可以看下 fmt 这个库 |
3
ipwx 2021-07-12 10:27:45 +08:00
你省略掉的栈帧可能是问题的关键。
|
4
TaylorJack123 2021-07-12 12:23:23 +08:00 via iPhone
不能给 std:string 变量初始化成“”
|
5
ysc3839 2021-07-12 22:32:36 +08:00
@TaylorJack123 按理来说是可以的,会算一次长度,得出长度为 0 。
|