Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Allegro]Wykrywanie wycieków pamięci

Ostatnio zmodyfikowano 2011-03-07 22:10
Autor Wiadomość
mar3
Temat założony przez niniejszego użytkownika
[C++, Allegro]Wykrywanie wycieków pamięci
» 2011-03-04 21:03:30
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:
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.
P-28855
DejaVu
» 2011-03-04 21:28:46
Jeżeli alokujesz jakieś zasoby to musisz je również zwalniać ;p pewnie jakiegoś obrazu czy czegoś tam innego nie zwalniasz :)
P-28857
mar3
Temat założony przez niniejszego użytkownika
» 2011-03-04 21:39:09
A czy nie ma jednak jakiegoś specjalnego programu? Bo przejrzałem po raz kolejny kod i dla wszystkich bitmap wywołuję funkcję destroy_bitmap() oraz dla wszystkich wczytanych plików .dat wywołuje funkcję unload_datafile(). A niczego nie tworzę przy pomocy operatora new.
P-28858
malan
» 2011-03-04 21:46:14
Ustawiłeś głębię kolorów na 32 (
set_color_depth( 32 );
)?
P-28859
ThudPoland
» 2011-03-04 21:49:44
Nie wczytujesz czasem jakiśch danych w pętli?
P-28860
DejaVu
» 2011-03-04 21:58:48
Specjalny program - Visual C++ to najlepsze środowisko jakie można sobie wyobrazić do pracy - kto dobrze projektuje kod za wczasu ten wycieków pamięci nie zaznaje ;p
P-28861
Drraven
» 2011-03-05 09:48:51
Może masz funkcje do wczytywania czegoś i wywołujesz ją w pętli ? sprawdź czy na pewno wszystko z programu usuwasz.

----------
Drraven
P-28873
mar3
Temat założony przez niniejszego użytkownika
» 2011-03-05 11:10:13
Ustawiłeś głębię kolorów na 32 (set_color_depth( 32 );)?
Miałem ustawione na 16. Zmieniłem na 32 i jest tak samo.

Nie wczytujesz czasem jakiśch danych w pętli?
Wczytuje dane z pliku:
C/C++
string tmpWiersz;
tmpWiersz.clear();
getline( wczytaj, tmpWiersz );
short k = 0;
short j = 0;
short l = 0;
while( k < MAPA_SZER * MAPA_WYS )
{
    if( tmpWiersz[ k ] > 32 && tmpWiersz[ k ] < 48 )
    {
        mapaK[ j ][ l ] = 0;
    }
    else
    {
        if( tmpWiersz[ k ] > 90 && tmpWiersz[ k ] < 97 )
             mapaK[ j ][ l ] =( tmpWiersz[ k ] + 6 ) - 96;
        else
             mapaK[ j ][ l ] =( tmpWiersz[ k ] + 49 ) - 96;
       
    }
   
    short n = k + 1;
    if(( n % MAPA_SZER ) == 0 )
    {
        j++;
        l = 0;
    }
    else
         l++;
   
    k++;
}

wczytaj.close();
oraz rysuje mapę w pętli:
C/C++
tabKafli.clear();

int map_x = ekr_x / KAFEL_SZER; //Przeliczenie współrzędnych ekranu
int map_y = ekr_y / KAFEL_WYS; //na współrzędne w tablicy mapy
int off_x = ekr_x % KAFEL_SZER; //z uwzględnieniem małego
int off_y = ekr_y % KAFEL_WYS; //przesunięcia względem ekranu

for( int x = 0; x < MAPA_MAXX + 1; x++ )
{
    for( int y = 0; y < MAPA_MAXY; y++ )
    {
        if( mapaK[ y + map_y ][ x + map_x ] != 0 && mapaK[ y + map_y ][ x + map_x ] <= 10 )
        {
            kafel kafel1( x * KAFEL_SZER - off_x, y * KAFEL_WYS - off_y, mapaK[ y + map_y ][ x + map_x ], kafelki, bufor );
            tabKafli.push_back( kafel1 );
        }
        else if( mapaK[ y + map_y ][ x + map_x ] > 10 )
        {
            enemy wrog1(( x * KAFEL_SZER - off_x ) + ekr_x, y * KAFEL_WYS - off_y, wrog, ekr_x, bufor );
            tabWrogow.push_back( wrog1 );
            mapaK[ y + map_y ][ x + map_x ] = 0;
        }
    }
}
for( unsigned int i = 0; i < tabWrogow.size(); i++ )
{
    tabWrogow[ i ].rysuj( ekr_x, bufor );
}
P-28876
« 1 » 2 3 4
  Strona 1 z 4 Następna strona