我对以下C ++代码感到有点困惑:
#include <iostream>
using namespace std;
void test(const string& str)
{
static const char * const c = str.c_str();
cout << c << endl;
}
int main(int argc, char* argv[])
{
test("Hello");
test("Nooo");
return 0;
}
由于变量c
被声明为static
和const
,因此不应仅将其初始化一次并保持其初始值直到该过程完成为止?根据这个推理,我期待以下输出:
Hello
Hello
但我得到了:
Hello
Nooo
您是否可以澄清为什么变量c
的值在两个函数调用之间被修改,即使它是const
变量?
答案 0 :(得分:14)
您的程序有未定义的行为。
当您将"hello"
传递给test
时,会创建一个临时std::string
对象,并构造该字符串c
(这只是指向数据的指针)字符串对象)。
当函数调用结束时,临时std::string
对象被销毁,c
成为悬空指针。再次使用它是未定义的行为。
在您的情况下,第二个临时std::string
对象的数据具有与第一个完全相同的内存地址,因此c
指向该数据。这无法保证。
答案 1 :(得分:1)
您的代码中有未定义的行为,因此这些结果可能会有所不同。 UB是因为调用test("Hello");
创建了一个临时值,然后您将其分配给静态局部变量。在调用结束后,此临时值将被破坏,因此测试函数中的指针悬空。如果你使用它,那么你有未定义的行为。
内存管理器可能会重用相同的内存区域,因此您可以在结果中看到Hello和Nooo。