Wykryte wycieki pamięci

W mojej aplikacji wxWidgets, podczas pracy w trybie debugowania otrzymałem ten Komunikat w wyjściu Visual Studio 2010. Aplikacja działała dobrze, i widziałem to dopiero po zamknięciu.

Wykryto wycieki pamięci!

Dumping objects - >

{9554} normalny blok o długości 0x003CDCC0, 44 bajty.
Dane: 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01

{9553} normalny blok o długości 0x003CDB58, 8 bajtów.

Dane: 44 BD 65 01 C0 DC 3C 00
{9552} normalny blok o 0x003CDC50, 48 bajtów.

Dane: A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

Zrzut obiektów zakończony.

W moim programie nie przydzielam jawnie pamięci, jednak Framework wxWidgets jest. Dostałem taką wiadomość po raz pierwszy i nie znam dokładnej przyczyny.

Jak pozbyć się tego wycieku pamięci?

Author: Vinayak Garg, 2011-12-17

5 answers

Wystarczy dodać następujące linie na początku głównej funkcji. Dodając tę flagę, Visual Studio złamie się w linii, która tworzy wyciek pamięci.

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

Upewnij się, że masz poprawny adres bloku object normal, ponieważ mogą one ulec zmianie i upewnij się, że kompilujesz na _DEBUG.

Zobacz także: _CrtSetDbgFlag i _CrtSetBreakAlloc .

 36
Author: mihaipopescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 19:54:18
  1. Nigdy nie zakładaj, że Twój kod jest odporny na wyciek pamięci. Chyba że jesteś jednym z programistycznych demi-bogów, nikt nie jest odporny na ewentualne pisanie wycieków pamięci.

  2. Możesz użyć narzędzia takiego jak bounds checker (od Microfocus), aby pomóc zidentyfikować wyciek pamięci, ponieważ da ci callstack. Raport wycieku pamięci otrzymany z debugowania CRT po prostu informuje o wycieku pamięci pod określonym adresem. Produkt taki jak bounds checker da ci callstack do tego wyciek pamięci i wiele innych gadżetów. Istnieją inne narzędzia wycieku pamięci tam na rynku, ale nie będę próbował ich wymienić tutaj.

  3. Jeśli jesteś pewien, że wyciek pamięci jest spowodowany 'wxWidgets', być może powinieneś poinformować autorów tej biblioteki i być może oni to naprawią (za pomocą odpowiednich kroków repro).

 0
Author: C Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 11:31:15

Być może niektóre rodzaje statycznych instancji są nadal przydzielane przez framework. Spróbuj rozwiązać go za pomocą profilera takiego jak "devpartner".

 0
Author: AlexTheo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 11:40:42

Ta wiki sugeruje dodanie następującej treści do każdego pliku źródłowego, po wszystkich innych nagłówkach:

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

Spowoduje to, że wycieki będą zgłaszane po zakończeniu programu.

Dokładniej, upewnij się, że wywołujesz ->Destroy() na wszystkich obiektach utworzonych za pomocą new (może poza Górnym oknem).

 0
Author: user1071136,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 11:52:42

Jeśli lokalizacja wycieku zgłoszonego przez vs jest taka sama za każdym razem, możesz ustawić databreakpoint, aby zobaczyć, kiedy ta pamięć jest zmieniana i miejmy nadzieję dowiedzieć się, kto alokuje tę pamięć

 0
Author: ans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 13:00:59