我尝试编写一个将值格式化为字符串的函数。但是,我遇到了它的持久性问题。
using namespace std;
string string_format(const string &msg, ...)
{
va_list ap;
char text[BUFF_SIZE] = { 0, };
va_start(ap, msg);
vsnprintf(text, BUFF_SIZE - 1, msg.c_str(), ap);
text[BUFF_SIZE - 1] = '\0';
va_end(ap);
return string(text);
}
int main()
{
char* p1 = (char*)string_format("%d", 123).c_str();
char* p2 = (char*)string_format("%d", 45).c_str();
printf("value: p1=%s, p2=%s\r\n", p1, p2);
}
以上将打印:
value: p1=45, p2=45
代替
value: p1=123, p2=45
我这样写代码是因为我想同时保留 2 个或更多 char* 实例。返回“新字符串(文本)”有效,但我不想继续写“删除”
最佳答案
当您使用 c_str()
时,您将获得一个指向字符串中的内部缓冲区的指针。该指针仅在字符串对象仍然存在时才有效。您正在获取一个指向立即被删除的临时字符串对象的指针,这会导致不正确的行为。之所以表现为“持久化”,很可能是因为这两个非常相似的字符串恰好使用了相同的内存空间。在字符串被销毁后访问指针在任何情况下都是未定义的行为。
如果您想使用 c_str
,您需要将生成的字符串存储到适当的 string
变量中,并在您需要指针时一直保留它们。
或者更好的是,根本不处理 char *
。由于您使用的是 C++,因此请始终为您的字符串使用适当的字符串对象。
关于c++ - 返回带有持久缓冲区的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23463917/