初始化静态常量变量

Initialization of a static const variable

本文关键字:变量 常量 静态 初始化      更新时间:2023-10-16

我对以下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变量吗?

您的程序有未定义的行为

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

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

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

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

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