Visual studio Visual Studio发布和调试生成析构函数
在VisualStudio2008(C++)中,我有一个类析构函数(我们称这个类为“a”),它删除指向另一个类(我们称这个类为“B”)的指针 看起来是这样的:Visual studio Visual Studio发布和调试生成析构函数,visual-studio,visual-c++,destructor,Visual Studio,Visual C++,Destructor,在VisualStudio2008(C++)中,我有一个类析构函数(我们称这个类为“a”),它删除指向另一个类(我们称这个类为“B”)的指针 看起来是这样的: A::~A() { delete B; B = NULL; } 我的B类有一个指向创建它的a实例的指针。在B的析构函数中,我删除了B中的所有内容,除了指向A实例的指针 在我的调试版本中,它工作正常,但在我的发布版本中失败 在调试生成中,在删除B之后但将B重新分配给NULL之前,指向A实例的指针的值有点奇怪,比如0xDDD
A::~A()
{
delete B;
B = NULL;
}
我的B类有一个指向创建它的a实例的指针。在B的析构函数中,我删除了B中的所有内容,除了指向A实例的指针
在我的调试版本中,它工作正常,但在我的发布版本中失败
在调试生成中,在删除B之后但将B重新分配给NULL之前,指向A实例的指针的值有点奇怪,比如0xDDDD。。但是在发布版本中,它仍然指向..的实例。。在这两种情况下,指向B的指针仍然有效,并且B没有被销毁。发生了什么事,我该怎么解决呢?如果我明白你的意思,一切都很好。调用
delete B
后,变量B
所持有的指针将保持不变。它仍将包含内存的地址。记忆可能改变,也可能不改变;这一部分是完全未定义的,取决于系统中当前发生的其他事情以及堆管理器的工作
完成对B的删除(并且B的析构函数已经运行)后,存储B的内存可能会更改,也可能不会更改(同样取决于堆管理器)。因此,B指向A的指针在一种构建类型中更改,而不是在另一种构建类型中更改,这一事实很好。删除后,您不能使用B中的任何内容。谢谢您的回复。。你说在我删除了B的实例之后,我不能在那个被删除的实例中使用任何东西。。但指向实例的指针会发生什么变化?A的实例将丢失指向它的指针,但这无关紧要,因为调用A的析构函数时应该删除它,对吗?由于某些原因,我的应用程序在发布构建场景中是不稳定的,C/C++中的指针只是一个内存地址。只要对象A是有效的,那么该地址就是有效的。在这种情况下没有引用计数(如上所述),因此指向a的指针的存在对a是否有效没有影响。事实上,在删除B之后,组成对象B的内存无法可靠地使用。