好的,所以我试图掌握堆的概念及其范围
#include <iostream>
int main(){
{
int* x = new int(10);
}
std::cout<<*x;//ERROR Use of undeclared identifier 'x'
}
但是由于我将其分配给了堆,为什么在块作用域之后它不再存在了?
答案 0 :(得分:5)
但是由于我将其分配给了堆,为什么在块作用域之后它不再存在了?
x
是一个自动变量,因此在声明该变量的范围之外不存在。
动态分配的对象确实仍然存在。但是,由于在x
的生命周期之后,不再有指向该对象的指针,因此不再可以使用它或删除它。这称为内存泄漏。
答案 1 :(得分:3)
已分配的内存块独立于包含其地址的变量。内存仍然存在,但变量不存在,因为它的范围以大括号结尾。
答案 2 :(得分:2)
动态分配的整数仍然存在(在堆上)。仅指向它的指针(x
)在范围之外。
尝试一下:
int main() {
int* x;
{
x = new int(10);
}
std::cout << *x;
}
此外,使用完内存后,请不要忘记释放内存:
delete x;