在Visual Studio 2008(C ++)中,我有一个类析构函数(让我们称这个类'A')删除指向另一个类的指针(让我们称这个类'B')。
它看起来像这样:
A::~A()
{
delete B;
B = NULL;
}
我的B类有一个指向创建它的A实例的指针。在B的析构函数中,我删除了B中的所有内容,除了指向A实例的指针。
在我的调试版本中,它运行正常,但在我的发布版本上失败了。
在调试版本中,在B被删除之后但在B被重新分配为NULL之前,指向A实例的指针的值是奇怪的,如0xdddddddd ..但是在Release版本中,它仍然指向A的实例。在两种情况下,指向B的指针仍然有效,B不会被销毁。发生了什么,我该如何解决?
答案 0 :(得分:0)
如果我明白你在说什么,一切都很顺利。调用delete B
后,变量B
保持的指针将保持不变。它仍将包含内存的地址。记忆可能改变也可能不改变;该部分是完全未定义的,取决于此时系统中发生的其他事情以及堆管理器的作用。
在完成对B的删除(并且B的析构函数已经运行)之后,存储B的存储器可能会也可能不会被更改(同样取决于堆管理器)。因此B指向A的指针在一种构建类型中改变而另一种构建类型没有改变这一事实很好。删除后,您无法在B中使用任何内容。