【发布时间】:2019-05-30 18:53:03
【问题描述】:
为什么我在删除它的范围后得到输出为 10?我创建了一个类A,它有一个指针类型的成员变量和另一个类B,它有另一个成员变量x。现在我在堆上为 B 分配内存,为 x 分配值为 10。为了创建 A 类的实例,我使用了 x 的内存地址。现在我正在删除对象 b 并打印类 A 的指针 ref 的值。 我明白为什么我得到输出为 10,因为我们可以看到持有该值的内存不再保留在堆上?
#include<iostream>
using namespace std;
class A
{
public:
int *ref;
A(int *ref):ref(ref)
{
}
};
class B{
public:
int x;
B(int x):x(x){}
};
int main()
{
B *b=new B(10);
A a(&b->x);
delete b;
cout<<*a.ref<<endl;
}
【问题讨论】:
-
几乎所有PC中的删除操作都不会擦除资源,而只是释放它们占用的空间以供将来使用。所以数据可能仍然存在一段时间,但访问该数据的结果是不确定的。
-
离题,但您以错误的方式使用了术语范围。范围是指名称可见的源代码部分。它不是指变量的生命周期,通常称为范围。因此,在堆上分配的数据具有无限的范围(因为它会一直存在,直到您将其删除),但指向该数据的任何指针变量都具有正常的范围规则。
标签: c++ scope heap-memory