对范围和堆内存生存期感到困惑
confused about scope and heap memory lifetime
好的,所以我试图掌握堆的概念及其范围
#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;
相关文章:
- GCC对可能有效的代码抛出init list生存期警告
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 创建具有全局生存期的 UObject
- C++17 和静态临时生存期的参考扩展
- 数组对象的生存期是否在重用其元素存储时结束?
- 共享指针生存期
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 指针引用的生存期(以 C++为单位)
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 全局静态生存期?他们会让你的程序崩溃吗?
- "std::function"的简单版本:函数对象的生存期?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- 理解C++指针生存期/僵尸指针
- 对范围和堆内存生存期感到困惑