我在看下面的代码(简化),并问自己如何安全是它使用此returnMsg
功能:从内部使用静态std :: string的函数返回const char *是否安全?
#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
内容的新访问可能最终会显示不同的内容并且不一致。
此功能是否需要以不同的方式书写才能在没有上述限制的情况下使用它?
实际上应该做的功能是什么?你可以用const char * msg2 =“Good bye”来代替'const char * msg2 = returnMsg(“Good bye”);''你不需要处理你现在遇到的问题 – user463035818
@ tobi303我不能说OP,但考虑一个稍微不那么简单的例子,其中用非静态字符串调用函数,并且在该缓冲区不再存在之后使用指针。这个函数可以方便地通过复制它的内容到一个静态字符串来延长这个缓冲区的生命周期...但是直到下一次调用这个函数。 – user2079303
@ user2079303没有冒犯性,但那是猜测和我会考虑这样的功能作为一个装饰的全球只是它比全球更坏 – user463035818