C++ 混淆作用域和堆内存生存期

C++ 混淆作用域和堆内存生存期,c++,C++,好的,我试着理解堆的概念和范围 #include <iostream> int main(){ { int* x = new int(10); } std::cout<<*x;//ERROR Use of undeclared identifier 'x' } #包括 int main(){ { int*x=新的int(10); } std::cout分配的内存块独立于包含其地址的变量。内存仍然存在,但变量不存在,因为其作用域

好的,我试着理解堆的概念和范围

#include <iostream>
int main(){

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

    std::cout<<*x;//ERROR Use of undeclared identifier 'x'
}
#包括
int main(){
{
int*x=新的int(10);
}

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

动态分配的整数仍然存在(在堆上)。只有指向它的指针(
x
)超出作用域

试试这个:

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

    std::cout << *x;
}
但是既然我把它分配给了堆,为什么在块的作用域之后它就不存在了呢

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


动态分配的对象仍然存在。但是在
x
的生命期结束后,不再有任何指向该对象的指针,因此无法再使用或删除该对象。这称为内存泄漏。

即使没有任何动态分配,也能正常工作,所以我不相信这一点这是一个很好的例子。@Fureeish不,如果没有动态分配,它将无法工作。
int*x;{int y=10;x=&y;}std::cout@eerorika这不是我想的。在答案中的代码中,如果你删除asteriks和
new
,它会做完全相同的事情。你提供的代码要好得多,应该使用imo作为反例。@fureish我不知道删除动态分配将如何证明动态分配的对象存在于分配对象的范围之外。我不建议它应该存在。示例应该演示差异,在这里我们观察到动态或自动生存期之间没有差异。我想问这个-这个示例如何显示动态分配的对象仍然存在?它以什么方式演示了什么?我的类比是,如果我们将动态分配更改为自动分配,我们将观察到没有差别。第一个注释中的代码不做同样的操作,因此我认为这是一个更好的例子。
delete x;