初始化静态常量变量
Initialization of a static const variable
我对以下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
变量吗?
您的程序有未定义的行为。
将"hello"
传递给test
时,将创建一个临时std::string
对象,并根据该字符串构造c
(它只是指向字符串对象数据的指针)。
当函数调用结束时,临时std::string
对象被破坏,c
变成一个悬空指针。再次使用它是未定义的行为。
在您的情况下,第二个临时std::string
对象的数据与第一个对象的内存地址完全相同,因此c
指向该数据。这是不能保证的。
您的代码中有未定义的行为,因此这些结果可能会有所不同。UB是因为调用test("Hello");
创建了一个临时变量,然后将其分配给静态局部变量。这个临时的在调用结束后被销毁,所以测试函数中的指针是悬空的。如果你使用它,那么你有未定义的行为。
内存管理器可能会重用相同的内存区域,这样您就可以在结果中看到Hello和Nooo。
相关文章:
- 用C++中的一个变量定义一个常量
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 非常量变量只读位置的赋值
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用大量已知常量变量的正确方法
- 常量成员函数中成员变量的类型
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 这些语句是否等效(静态变量、常量变量和泛型)
- 如何将变量内容常量转换为 std::array 的大小?
- 我应该使我的局部变量常量还是可移动的
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 对全局变量的非常量引用的初始化无效
- 如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 全局变量/常量的替代方案
- 为什么首选 if( 常量 == 变量 ) 而不是 if ( 变量 == 常量 )
- 在c++中声明一个变量常量有什么意义