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

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

  •  
  •   mingl0280 · 2021-07-12 05:37:43 +08:00 · 1942 次点击
    这是一个创建于 1237 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类:

    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  
       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] 直接写入。
    chinuno
        2
    chinuno  
       2021-07-12 08:53:36 +08:00 via Android   ❤️ 3
    你这段代码试了一下没有复现。应该是项目中其他地方越界之类破坏内存了导致这里挂掉。有没有试过单独写个 main 验证这个类的问题
    格式化 string 推荐用 1L 的方法,或者可以看下 fmt 这个库
    ipwx
        3
    ipwx  
       2021-07-12 10:27:45 +08:00
    你省略掉的栈帧可能是问题的关键。
    TaylorJack123
        4
    TaylorJack123  
       2021-07-12 12:23:23 +08:00 via iPhone
    不能给 std:string 变量初始化成“”
    ysc3839
        5
    ysc3839  
       2021-07-12 22:32:36 +08:00
    @TaylorJack123 按理来说是可以的,会算一次长度,得出长度为 0 。
    mingl0280
        6
    mingl0280  
    OP
       2021-07-12 23:08:25 +08:00
    @chinuno 是的,就是我自己的锅。我特喵的用了个 TB* instance 然后没初始化这个指针。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2879 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:55 · PVG 16:55 · LAX 00:55 · JFK 03:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.