【发布时间】:2018-03-04 16:50:27
【问题描述】:
我有一个我需要转换为const char * 的数字(我正在使用它们的API 需要const char * 作为其许多函数的输入)。以下作品:
int num = 5;
std::string s = std::to_string(5);
const char * p = s.c_str();
正如how to convert from int to char*? 中的答案所建议的那样,但它涉及创建看似不必要的变量s,所以我尝试了以下方法,但它不起作用(p 之后指向一个空字符串):
int num = 5;
const char * p = std::to_string(num).c_str();
有没有一种干净的方法可以做到这一点?为什么第二个例子不起作用?如果我犯了这个明显的错误,这种行为与发生的情况非常相似:
const char * p;
{
std::string tempStr( "hi" );
p = tempStr.c_str( );
// p points to "hi" string.
}
// now p points to "" string.
这让我怀疑问题 std::to_string(num) 立即超出范围或类似的东西,因为它不用于直接初始化任何东西。
【问题讨论】:
-
为什么不直接使用
std::string而忘记const char*? (std::string只是一个char*包裹在有用的代码中来做一些事情,所以你不需要) -
那个“看似不必要”的实例管理着
p指向的动态分配的内存。在第二个示例中,该内存被立即释放,留下p一个悬空指针。在第三个示例中相同,只是更明确一点。 -
@Galik 是的,我很乐意,但我使用的 API 需要 const char* 作为我经常使用的某些函数的输入。
-
每次调用
API时只需传递s.c_str()(这就是它的用途)。 -
变量
s不是必需的。需要确保创建的std::string存在足够长的时间,以使其他代码(例如您正在使用的 API)可以安全地使用指向其内部的指针(例如s.c_str()返回的指针)。
标签: c++ string object-lifetime