gpt4 book ai didi

c++ - 从内部使用静态 std::string 的函数返回 const char * 是否安全?

转载 作者:可可西里 更新时间:2023-11-01 18:24:59 34 4
gpt4 key购买 nike

我正在查看以下代码(简化)并问自己使用此 returnMsg 函数有多安全:

#include <iostream>

using namespace std;

const char *returnMsg(const char *msg)
{
static std::string message;

message = msg;

return message.c_str();
}

int main(int argc, char *argv[])
{
const char *msg1 = returnMsg("Hello world");
printf("msg1 = %p\n", msg1);
cout << msg1 << endl;

const char *msg2 = returnMsg("Good bye");
printf("msg2 = %p\n", msg2);
cout << msg2 << endl;

cout << msg1 << endl;

return 0;
}

输出是:

msg1 = 0x23a6028
Hello world
msg2 = 0x23a6028
Good bye
Good bye

msg2 被写入了两次,这是我所期望的,因为静态消息变量在程序的生命周期内保留在内存中并且没有内存重新分配,所以在 msg1 地址替换为 msg2 的新内容。

但是,如果 msg2 的大小更大,则在 std::string message 变量中进行内部重新分配,输出为:

msg1 = 0x1cc6028
Hello world
msg2 = 0x1cc6058
Good bye looooooooooooooooooooooooooooooooooooooooong
Hello world

但我想不能保证 msg1 地址将来不会被重复使用,因此对 msg1 内容的新访问最终可能会显示不同的内容并且不连贯。

是否需要以不同的方式编写此函数,以便在不受上述限制的情况下使用它?

最佳答案

Is it safe to return a const char * from a function that use a static std::string internally?

是的,那是安全的。

但是在该指针失效后使用该指针是不安全的,这就是所示程序所做的。如果重新分配,指针将在对该函数的连续调用中的赋值而失效。因此,指针仅在下一次调用该函数之前是安全的(这会导致重新分配)。

Does this function needs to be written differently to make it possible to use it without the limitations shown above ?

该函数具有所描述的限制,因此当然必须以不同的方式编写它才能没有这些限制。

您的方法的核心问题是您只有一个静态字符串,但想要存储多个字符串同时又不丢弃任何较早的字符串。因此,您似乎需要一大堆静态字符串:

const char *returnMsg(const char *msg)
{
static std::forward_list<std::string> messages;
messages.emplace_front(msg);
return messages.front().c_str();
}

虽然这可以如您所愿地工作,但它很愚蠢。考虑一下您是否真的想为执行的其余部分存储所有字符串。如果不是,则静态存储不是解决方案。

关于c++ - 从内部使用静态 std::string 的函数返回 const char * 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587775/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com