初始化静态const变量

时间:2016-07-25 15:47:20

标签: c++ static

我对以下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被声明为staticconst,因此不应仅将其初始化一次并保持其初始值直到该过程完成为止?根据这个推理,我期待以下输出:

Hello
Hello

但我得到了:

Hello
Nooo

您是否可以澄清为什么变量c的值在两个函数调用之间被修改,即使它是const变量?

2 个答案:

答案 0 :(得分:14)

您的程序有未定义的行为

当您将"hello"传递给test时,会创建一个临时std::string对象,并构造该字符串c(这只是指向数据的指针)字符串对象)。

当函数调用结束时,临时std::string对象被销毁,c成为悬空指针。再次使用它是未定义的行为。

在您的情况下,第二个临时std::string对象的数据具有与第一个完全相同的内存地址,因此c指向该数据。这无法保证。

答案 1 :(得分:1)

您的代码中有未定义的行为,因此这些结果可能会有所不同。 UB是因为调用test("Hello");创建了一个临时值,然后您将其分配给静态局部变量。在调用结束后,此临时值将被破坏,因此测试函数中的指针悬空。如果你使用它,那么你有未定义的行为。

内存管理器可能会重用相同的内存区域,因此您可以在结果中看到Hello和Nooo。