1

为什么我在删除它的范围后输出为10 ?我创建了一个具有指针类型成员变量的类A和另一个具有另一个成员变量x的类B。现在我在堆上为 B 分配内存,值为10x为了创建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; 
}
4

3 回答 3

4

这是未定义的行为。例如,当我在 MSVC 中运行您的示例时,我的输出是-572662307.

如果您尝试访问无效内存,则无法保证会发生什么。可能会发生的情况是它无论如何都会访问无效内存,如果该内存没有更改,您可能会得到旧值。这实际上是一件坏事,因为该程序似乎按预期工作,而实际上并非如此。

我明白为什么我的输出为 10,因为我们可以看到持有该值的内存不再保留在堆上?

内存不再有效,但数字10可能仍在该内存中,并且a.ref仍指向该内存。因此,即使内存无效,10也可能仍然存在。

于 2019-01-04T07:48:48.343 回答
0

您所拥有的是未定义的行为,因为程序正在访问不再属于它的内存。
delete释放内存以便可以重用,但这并不意味着该内存位置中的值设置为零(如果这是您所期望的)。

于 2019-01-04T07:50:56.983 回答
0

这是因为悬空指针效应。尽管我们已经删除了内存数据,但尚未擦除或没有其他数据存储在那里,我们的指针仍然指向该内存。

供参考 https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

于 2019-01-04T09:31:28.757 回答