对范围和堆内存寿命感到困惑

时间:2019-01-05 22:58:30

标签: c++

好的,所以我试图掌握堆的概念及其范围

#include <iostream>
int main(){

    {
        int* x = new int(10);
    }

    std::cout<<*x;//ERROR Use of undeclared identifier 'x'
}

但是由于我将其分配给了堆,为什么在块作用域之后它不再存在了?

3 个答案:

答案 0 :(得分:5)

  

但是由于我将其分配给了堆,为什么在块作用域之后它不再存在了?

x是一个自动变量,因此在声明该变量的范围之外不存在。

动态分配的对象确实仍然存在。但是,由于在x的生命周期之后,不再有指向该对象的指针,因此不再可以使用它或删除它。这称为内存泄漏。

答案 1 :(得分:3)

已分配的内存块独立于包含其地址的变量。内存仍然存在,但变量不存在,因为它的范围以大括号结尾。

答案 2 :(得分:2)

动态分配的整数仍然存在(在堆上)。仅指向它的指针(x)在范围之外。

尝试一下:

int main() {
    int* x;
    {
        x = new int(10);
    }

    std::cout << *x;
}

此外,使用完内存后,请不要忘记释放内存:

delete x;