wykrywanie wycieków pamięci

Problemy i ich rozwiązania w C++.
mar3
Bywalec
Bywalec
Posty: 44
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

wykrywanie wycieków pamięci

Post przez mar3 »

Piszę pełnoekranową grę w VS C++ Express 2010 na win 7 pro x64. Za każdym razem kiedy wyłączam tą moją grę to zmieniają się ikony (na pasku zadań) otwartych programów na ikony innych programów. Pomyślałem, że to może wina wycieków pamięci. Postąpiłem tak jak w tym artykule.

Po skompilowaniu w konsoli ujrzałem:

Code: Zaznacz cały

Detected memory leaks!
Dumping objects ->
{745} normal block at 0x05827F00, 504 bytes long.
 Data: <                > 00 00 00 00 C0 01 00 00 02 00 00 00 20 00 00 00 
{742} normal block at 0x058225F0, 20 bytes long.
 Data: <                > A6 01 00 00 AA 01 00 00 20 00 18 00 01 00 00 00 
{141} normal block at 0x004F4DE0, 256 bytes long.
 Data: <9MO             > 39 4D 4F 00 00 00 00 00 CD CD CD CD CD CD CD CD 
{140} normal block at 0x004F4D38, 107 bytes long.
 Data: <"C:\Users\Marcin> 22 43 3A 5C 55 73 65 72 73 5C 4D 61 72 63 69 6E 
{139} normal block at 0x004F4CF0, 8 bytes long.
 Data: <  -     > 9C D3 2D 01 00 00 00 00 
{138} normal block at 0x004F4CA8, 8 bytes long.
 Data: <  -     > 88 D3 2D 01 00 00 00 00 
Object dump complete.
Przeglądałem kod tej swojej gry już kilka razy i nie mogę znaleźć błędu. Czy jest jakiś sposób na dowiedzenie się w których linijkach kodu występuje wyciek? Może jest jakiś specjalny program?

Bardzo proszę o pomoc.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: wykrywanie wycieków pamięci

Post przez Morfidon »

Cytuję ze strony, którą podałeś:
"Kojelnym mykiem jaki warto zastosować to dodanie następującego wiersza w naszym programie:
C/C++
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)"

Możesz też spróbować:

Code: Zaznacz cały

 _CrtSetBreakAlloc(index)
gdzie index to te liczby w {}

Tu masz więcej na temat wykrywania wycieków z pamięci
mar3
Bywalec
Bywalec
Posty: 44
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Post przez mar3 »

Tylko, że ja mam napisaną linijkę

Code: Zaznacz cały

#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
Z resztą nie korzystam z operatora new. A plik main.cpp ma tylko 176 wierszy, a tam przecież już w pierwszej linii piszę {745}. Dla wszystkich bitmap wywołuję funkcję destroy_bitmap() oraz dla wszystkich wczytanych plików .dat wywołuje funkcję unload_datafile() (Korzystam z biblioteki Allegro).
A co do tego linka, którego podałeś to czy nie mógłbyś dać do czegoś po Polsku?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: wykrywanie wycieków pamięci

Post przez Morfidon »

Spróbowałeś funkcji, którą Ci podałem?

{745} to nie jest linia to liczba przydzielona w pamięci.

Jeżeli chcesz zostać informatykiem i tworzyć cokolwiek bardziej zaawansowanego musisz nauczyć się angielskiego.

Na tej stronie co Ci podałem pisze: "When you run your program under the debugger", czy odpaliłeś program pod debuggerem?
mar3
Bywalec
Bywalec
Posty: 44
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Post przez mar3 »

Spróbowałeś funkcji, którą Ci podałem?
Tak, spróbowałem tylko że nic to nie dało.
Na tej stronie co Ci podałem pisze: "When you run your program under the debugger", czy odpaliłeś program pod debuggerem?
Tak, uruchamiam tę grę w trybie Debug.
mar3
Bywalec
Bywalec
Posty: 44
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Post przez mar3 »

Dziękuje za pomoc. Wreszcie mi się udało.
1) Wrzuciłem cały kod z maina (prócz _CrtDumpMemoryLeaks();) w sztuczny blok
2) Do pisałem wywołanie funkcji _cexit(); przed wywołaniem _CrtDumpMemoryLeaks();

Code: Zaznacz cały

#include <process.h>
int main()
{
    {
        allegro_init();
        //...
        allegro_exit();
    }
    _cexit();
    _CrtDumpMemoryLeaks();
    return 0;
}
Post Reply