uint64_t转const char*异常:直接调用c_str()无输出问题咨询
uint64_t转const char*直接调用c_str()无输出的原因及解决方法
问题根源
std::to_string(channel_id2)会生成一个临时std::string对象,这个对象仅在当前语句的执行周期内存在,语句结束后就会被自动销毁。而c_str()返回的是指向该string内部字符缓冲区的指针,临时对象销毁后,这块内存会被系统回收,此时指针就变成了野指针,后续访问它属于未定义行为,所以无法输出有效内容。
正确做法
必须先将std::to_string的结果存入一个拥有稳定生命周期的std::string对象(比如局部变量、类成员变量等),再调用c_str()获取指针。只要string对象的生命周期覆盖了指针的使用周期,指针指向的内存就始终有效,就能正常打印内容。
错误示例
uint64_t channel_id2 = 123456; const char *sz2 = std::to_string(channel_id2).c_str(); // sz2已成为野指针,访问结果不可预测 printf("%s\n", sz2);
正确示例
uint64_t channel_id2 = 123456; std::string str_val = std::to_string(channel_id2); const char *sz2 = str_val.c_str(); // str_val未被销毁,sz2指向有效内存 printf("%s\n", sz2);
额外注意
如果需要在函数外部或更长的代码块中使用这个const char*指针,一定要确保对应的std::string对象不会被提前销毁。比如不要在函数内创建局部string后直接返回它的c_str()指针,这同样会导致返回的指针变成野指针。
内容的提问来源于stack exchange,提问作者cat
相关产品推荐
相关产品推荐

