Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio Visual Studio发布和调试生成析构函数_Visual Studio_Visual C++_Destructor - Fatal编程技术网

Visual studio Visual Studio发布和调试生成析构函数

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

在VisualStudio2008(C++)中,我有一个类析构函数(我们称这个类为“a”),它删除指向另一个类(我们称这个类为“B”)的指针

看起来是这样的:

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的内存无法可靠地使用。