Visual Studio Release и Debug строит деструктор - PullRequest
1 голос
/ 24 февраля 2010

В Visual Studio 2008 (C ++) у меня есть деструктор класса (назовем этот класс 'A'), который удаляет указатель на другой класс (назовем этот класс 'B').

это выглядит так:

A::~A()
{
    delete B;
    B = NULL;
}

Мой класс B имеет указатель на экземпляр A, который его создал. В деструкторе B я удаляю все в B, кроме указателя на экземпляр A.

В моей отладочной сборке все работает нормально, но не получается в моей сборочной версии ..

В отладочной сборке, сразу после удаления B, но до того, как B переназначен на NULL, значение указателя на экземпляр A выглядит странно, как 0xdddddddd. экземпляр A .. В обоих случаях указатель на B все еще действителен и B не уничтожается. Что происходит и как мне это исправить?

1 Ответ

0 голосов
/ 24 февраля 2010

Если я понимаю, что вы говорите, все работает отлично.После вызова delete B указатель, удерживаемый переменной B, не изменится.Он по-прежнему будет содержать адрес памяти.Память может или не может измениться;эта часть полностью не определена и зависит от других вещей, происходящих в системе в данный момент, и от того, что делает менеджер кучи.

После того, как удаление в B завершено (и деструктор B запущен), память, в которой хранилась B, может изменяться или не изменяться (опять же, это зависит от менеджера кучи).Таким образом, тот факт, что указатель B на A изменяется в одном типе сборки, а не в другом - это хорошо.После удаления вы не можете использовать что-либо в B.

...