2011-12-17 3 views
9

В моем приложении wxWidgets во время работы в режиме отладки я получил это сообщение в Output of Visual Studio 2010. Приложение работает нормально, и я видел это только после его закрытия.Обнаруженные утечки памяти

Обнаруженные утечки памяти!

самосвальные объекты ->

{9554} нормальный блок на 0x003CDCC0, 44 байт длиной.
данных: < е н и й> 20 С1 65 01 01 00 00 00 00 00 6E 00 9C CE длиной 64 01

{9553} нормальный блок на 0x003CDB58, 8 байт.

данных: < < Д Е> 44 BD 65 01 C0 постоянного тока 3C 00
{9552} нормальный блок в 0x003CDC50, длиной 48 байт.

данные: < х> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

дамп объекта завершены.

В моей программе я явно не выделяю память, однако структура wxWidgets. У меня есть такое сообщение в первый раз, и я не знаю его точной причины.

Как я могу избавиться от этой утечки памяти?

+1

Post ваш код, предпочтительно минимальную программу который воспроизводит проблему. – user1071136

+0

К сожалению, я не могу опубликовать минимальную программу. Потому что это GUI-программа с несколькими файлами и графический интерфейс. Я понятия не имею, что вызывает это. Потому что я нигде не использовал 'new' или' malloc'. –

+0

Я просто боюсь, что вы получите больше догадок, чем ответов :) – user1071136

ответ

24

Вам просто нужно добавить следующие строки в начале вашей основной функции. Добавляя этот флаг, Visual Studio разбивается на линию, которая создает утечку памяти.

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetBreakAlloc(9554); 
    _CrtSetBreakAlloc(9553); 
    _CrtSetBreakAlloc(9552); 

Убедитесь, что у вас есть правильный адрес нормального блока, потому что они могут измениться и обеспечить компиляцию на _DEBUG.

См. Также: _CrtSetDbgFlag и _CrtSetBreakAlloc MSDN справка.

+1

Спасибо, что действительно сработало для меня, добавляя '_crtBreakAlloc = 9609;' как очень первый оператор. Для wxWidgets мне пришлось добавить его в функцию OnInit() 'основного приложения. –

+2

Привет, как вы придумали 9609? –

0

Возможно, некоторые виды статических экземпляров по-прежнему выделяются инфраструктурой. Попробуйте решить его с помощью профилировщика, например, «devpartner».

+0

Может ли сообщение от визуальной студии быть использовано для получения некоторой помощи? –

+0

@VinayakGarg Может помочь, но очень ограниченное использование. Перечисленные данные «Данные» на самом деле являются содержимым адреса памяти, с помощью которого вы можете угадать, для чего используется память, и угадать, где она выделена. – fefe

+0

Он использует окна, поэтому Valgrind не будет работать здесь. –

0
  1. Никогда просто не предполагайте, что ваш код является защитой от утечки памяти. Если вы не являетесь одним из программистов-полубогов, никто не застрахован от возможной записи утечек памяти.

  2. Вы можете использовать инструмент, например, средство проверки границ (из микрофокуса), чтобы идентифицировать утечку памяти, потому что она даст вам стоп-колл. Отчет об утечке памяти, который вы получили из отладочной ЭЛТ, просто говорит вам, что утечка памяти происходит по определенному адресу. Продукт, такой как средство проверки границ, даст вам стоп-сигнал для этой утечки памяти, а также множество других полезных свойств. На рынке есть другие инструменты утечки памяти, но я не буду их перечислять здесь.

  3. Если вы уверены, что утечка памяти происходит из-за «wxWidgets», возможно, вам следует сообщить авторам этой библиотеки и, возможно, они ее исправит (с соответствующими этапами воспроизведения).

+1

Я никогда не говорил, что мой код является доказательством утечки памяти, его просто я не использовал новый или malloc в своем коде. Да, возможно, я должен попробовать просить об этом на сайте wxWidgets. –

0

This wiki предлагает добавить следующее каждый исходный файл, который вы имеете, после того, как все остальные заголовка включают'S:

#ifdef __WXMSW__ 
    #include <wx/msw/msvcrt.h>  // redefines the new() operator 
#endif 

Это приведет к утечке сообщается, когда заканчивается ваша программа.

В частности, убедитесь, что вы вызываете ->Destroy() на все объекты, которые вы создаете, используя new (за исключением, может быть, вашего верхнего окна).

0

Если место утечки сообщалось В. такое же каждый раз, когда вы могли бы установить databreakpoint видеть, когда эта память меняется, и мы надеемся выяснить, кто выделяет эту память

Смежные вопросы