何时使用 "Static" 进行持久性
When To Use "Static" For Persistence
我知道静态可以为 c++ 中的东西提供持久性,但我对何时有必要感到困惑。
例如,如果我有一个函数:
const int get5(){
int x = 5;
return x;
}
我打印了回报,5自然会出现。但是,如果我尝试对数组进行相同的操作:
const int* getArray() {
int arr[5];
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
arr[3] = 8;
arr[4] = 9;
return arr;
}
我遍历数组的每个元素,我只是变得笨拙:
const int* ptr = getArray();
for (int index = 0; index < 5; index++) {
cout << ptr[index] << endl;
}
结果:
5
19920968
257848734
258124688
258124688
但是,如果我用静态修饰符在 arr 前面,赋予它持久性,它可以工作:
5
6
7
8
9
我的问题是,为什么我需要将数组声明为静态才能使其值持久化,但在其他类型中,这不是必需的?谢谢!
不同之处在于,在第一个示例中,您返回一个副本,在第二个示例中,您返回一个指针。当您返回副本时,原始值是否被销毁并不重要。但是,当您返回指针时,必须确保指向对象的生存期超过函数的末尾,否则您将获得未定义的行为。
这是因为对于数组,返回指向我的问题是,为什么我需要将数组声明为
static
才能使其值持久化,但在其他类型中,它不是必需的?
数组数据的指针,而对于其他类型,它是数据的副本。
在以下函数中:
const int* getArray() {
int arr[5];
...
return arr;
}
最后一个语句中表达式中的arr
衰减为指向数组第一个元素的指针。函数getArray()
返回此指针(而不是数组的副本(,该指针指向具有自动存储持续时间的数据。因此,在函数返回后,应不再访问该数据。
但是,如果将数组arr
声明为 static
,即使您仍然返回指向数组第一个元素的指针,此数据在函数返回后仍然存在。
arr 是在本地范围内创建的,这意味着一旦函数返回,它就会被丢弃。它占用的内存(在这种情况下,它很可能驻留在寄存器中(然后被其他进程使用(如果使用寄存器,则由程序中的下一条指令使用(,这就是您看到奇怪值的原因。
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 当比特(而不是字节)的顺序至关重要时的持久性
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 乘以整数的持久性
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- MSI 安装的数据持久性
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- static是如何使用ClassA::m_variable处理所有类对象的
- LNK2001:未解析的外部符号public:static类std::vector
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- 何时使用 "Static" 进行持久性