V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mingl0280
V2EX  ›  问与答

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

  •  
  •   mingl0280 · 104 天前 · 951 次点击
    这是一个创建于 104 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类:

    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
    
    ......(后面还有很长的栈,没贴了)
    

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

    6 条回复    2021-07-12 23:08:25 +08:00
    ysc3839
        1
    ysc3839   104 天前 via Android
    说个题外话,C++17 开始 std::string 可以先用 resize()分配空间,然后用 data()获取数据指针直接写入。
    另外,按照 https://stackoverflow.com/a/39200666 的说法,从 C++11 开始就可以 resize()后使用 &str[0] 直接写入。
    chinuno
        2
    chinuno   103 天前 via Android   ❤️ 3
    你这段代码试了一下没有复现。应该是项目中其他地方越界之类破坏内存了导致这里挂掉。有没有试过单独写个 main 验证这个类的问题
    格式化 string 推荐用 1L 的方法,或者可以看下 fmt 这个库
    ipwx
        3
    ipwx   103 天前
    你省略掉的栈帧可能是问题的关键。
    TaylorJack123
        4
    TaylorJack123   103 天前 via iPhone
    不能给 std:string 变量初始化成“”
    ysc3839
        5
    ysc3839   103 天前
    @TaylorJack123 按理来说是可以的,会算一次长度,得出长度为 0 。
    mingl0280
        6
    mingl0280   103 天前
    @chinuno 是的,就是我自己的锅。我特喵的用了个 TB* instance 然后没初始化这个指针。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1510 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 16ms · UTC 00:49 · PVG 08:49 · LAX 17:49 · JFK 20:49
    ♥ Do have faith in what you're doing.