这个 std::string 为啥没法赋值

2021-07-12 05:37:43 +08:00
 mingl0280

类:

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

......(后面还有很长的栈,没贴了)

问下这个有可能是啥奇怪的问题……

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX