何时使用“静态”进行持久化

时间:2018-01-26 17:05:58

标签: c++

我理解静态可以为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

我的问题是,为什么我需要将数组声明为静态,因为它的值是持久的,但在其他类型中,它不是必需的?谢谢!

3 个答案:

答案 0 :(得分:5)

不同之处在于,在第一个示例中,您将返回副本,在第二个示例中,您将返回指针。当您返回副本时,原始值是否被销毁无关紧要。但是当你返回一个指针时,你必须确保指向对象的生命周期超出函数的末尾,否则你将得到未定义的行为。

答案 1 :(得分:1)

  

我的问题是,为什么我需要将数组声明为static,因为它的值是持久的,但在其他类型中,它不是必需的?

这是因为对于数组,返回指向数组数据的指针,而对于其他类型,它是数据的副本。

在以下功能中:

const int* getArray() {
    int arr[5];
    ...
    return arr;
}
最后一个语句中的表达式中的

arr衰减为指向数组第一个元素的指针。函数getArray()返回此指针(以及数组的副本),该指针指向具有自动存储持续时间的数据。因此,在函数返回后,不应再访问该数据。

但是,如果将数组arr声明为static,即使仍然返回指向数组第一个元素的指针,该数据也会在函数返回后保留。

答案 2 :(得分:1)

arr在本地范围内创建,这意味着一旦函数返回就会丢弃它。它占用的内存(在这种情况下,它很可能驻留在寄存器中)然后由其他进程使用(或者如果使用寄存器则由程序中的下一条指令使用),这就是你看到奇怪值的原因。