c++ - 返回带有持久缓冲区的字符串

标签 c++ g++

我尝试编写一个将值格式化为字符串的函数。但是,我遇到了它的持久性问题。

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/

相关文章:

java - c++动态绑定(bind)和java动态绑定(bind)有什么区别?

c++ - OpenGL - 2D敌人不旋转面对玩家

C++ 序列化消息的方法?

c++ - 如何编译静态链接除一个库之外的所有库 (G++)

c++ - 编译错误 : "no matching function for call to" when returning static_cast reference

c++ - C++ 中的函数对象自动检测类型

c++ - 如何使用 gdbus-codegen 注释带有 org.gtk.GDBus.C.ForceGVariant 的 xml 文件

c++ - 在 Debian 8.7 上安装 g++ 7.0.1

c++ - 在 C++ 中交换二维 double 组

linux - 如何解决共享库中 undefined reference ?