Обнаруженные утечки памяти - PullRequest
11 голосов
/ 17 декабря 2011

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

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

Сброс объектов ->

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

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

Данные: 44 BD 65 01 C0 DC 3C 00
{9552} нормальный блок в 0x003CDC50, длиной 48 байтов.

Данные: A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

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

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

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

Ответы [ 5 ]

33 голосов
/ 17 декабря 2011

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

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

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

См. Также: _CrtSetDbgFlag и _CrtSetBreakAlloc .

0 голосов
/ 17 декабря 2011

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

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

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

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

0 голосов
/ 17 декабря 2011

В этой вики предлагается добавить следующее к каждому имеющемуся исходному файлу после всех остальных заголовков:

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

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

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

0 голосов
/ 17 декабря 2011

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

...