wykrywanie wycieków pamięci

Problemy i ich rozwiązania w C++.

wykrywanie wycieków pamięci

Postprzez mar3 » piątek, 4 marca 2011, 21:50

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:
Kod: 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.
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Postprzez Morfidon » sobota, 5 marca 2011, 11:30

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ć:
Kod: Zaznacz cały
_CrtSetBreakAlloc(index)


gdzie index to te liczby w {}

Tu masz więcej na temat wykrywania wycieków z pamięci
Morfidon
Administrator
Administrator
 
Posty: 593
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48

Re: wykrywanie wycieków pamięci

Postprzez mar3 » sobota, 5 marca 2011, 13:04

Tylko, że ja mam napisaną linijkę
Kod: 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?
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Postprzez Morfidon » sobota, 5 marca 2011, 15:00

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?
Morfidon
Administrator
Administrator
 
Posty: 593
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48

Re: wykrywanie wycieków pamięci

Postprzez mar3 » sobota, 5 marca 2011, 15:53

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: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15

Re: wykrywanie wycieków pamięci

Postprzez mar3 » wtorek, 8 marca 2011, 15:28

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();
Kod: Zaznacz cały
#include <process.h>
int main()
{
    {
        allegro_init();
        //...
        allegro_exit();
    }
    _cexit();
    _CrtDumpMemoryLeaks();
    return 0;
}
mar3
Bywalec
Bywalec
 
Posty: 40
Dołączył(a): poniedziałek, 15 czerwca 2009, 16:15


Powrót do C++

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron