Strong Pointer вызывает повреждение кучи при закрытии приложения при наличии std :: vector - PullRequest
1 голос
/ 06 июля 2011

Я получаю странную ошибку повреждения кучи во время закрытия приложения, где, если в моем коде присутствует «std :: vector», И я удаляю свою переменную «ref_count».Если у меня нет std :: vector, сбоя нет.Если есть std :: vector и я не удаляю ref_count (что приводит к утечке памяти), то происходит сбой кучи.Я сделал мой тестовый набор как можно меньшим, но, к сожалению, он слишком велик, поэтому он расположен в http://codepad.org/USIPjPHJ.Кто-нибудь есть какие-либо предложения о том, в чем может быть проблема?

Я получу сбой с исключением кучи этого в моих окнах вывода.


HEAP [CrashTest.exe]:HEAP: Блок свободной кучи 6d4c30, измененный в 6d4c58 после освобождения, Windows вызвал точку останова в CrashTest.exe.

Это может быть связано с повреждением кучи, что указывает на ошибку в CrashTest.exe или любой другойиз загруженных библиотек.

Это также может быть связано с тем, что пользователь нажимает клавишу F12, когда фокус находится на CrashTest.exe.

В окне вывода может быть больше диагностической информации.


Моя IDE - это Visual Studio 2010 с пакетом обновления 1 (также не с пакетом обновления 1), но это не должно вызывать проблему.

1 Ответ

3 голосов
/ 06 июля 2011

Эта строка:

strong_ref<int> reg1;

устанавливает * ref_count в 0 (потому что ptr == NULL), тогда эта строка:

strong_ref<int> copy1(reg1);

увеличивает * ref_count до 1.

При выходе деструктор вызывается дважды (один раз для reg1, один раз для copy1). В первый раз * ref_count уменьшается до 0, а ref_count освобождается, оставляя висячую ссылку во второй раз.

...