对范围和堆内存生存期感到困惑

confused about scope and heap memory lifetime

本文关键字:生存期 内存 范围      更新时间:2023-10-16

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

#include <iostream>
int main(){
    {
        int* x = new int(10);
    }
    std::cout<<*x;//ERROR Use of undeclared identifier 'x'
}

但是既然我把它分配给堆,为什么在块的范围之后它不再存在了?

但是既然我把它分配给堆,为什么在块的范围之后它不再存在了?

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

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

分配的内存块独立于包含其地址的变量。内存仍然存在,但变量不存在,因为它的作用域在大括号处结束。

动态定位的整数仍然存在(在堆上)。只有指向它的指针(x)不在范围之内。

试试这个:

int main() {
    int* x;
    {
        x = new int(10);
    }
    std::cout << *x;
}

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

delete x;