Zarządzanie pamięcią(ogolnie) (ale też odnośnie obiektów w grze) - parę pytań
Ostatnio zmodyfikowano 2014-05-07 13:26
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-05 17:20:10 for( int l = 0; l < Game_Manager.GetMob().size(); l++ ) { if( Game_Manager.GetMob()[ l ]->GetBounds().contains( Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().x, Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().y ) ) { Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->Hit(); Game_Manager.GetMob()[ l ]->Defend( Game_Manager.GetPlayer()[ k ]->Attack() ); if( typeid( * Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ] ) == typeid( AmmoWizardExplosion ) ) { for( int n = 0; n < Game_Manager.GetMob().size(); n++ ) { if( n == l ) continue; int tmp = sqrt( pow( Game_Manager.GetMob()[ n ]->GetPosition().x + Game_Manager.GetMob()[ n ]->GetSize().x / 2 - Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().x, 2 ) + pow( Game_Manager.GetMob()[ n ]->GetPosition().y + Game_Manager.GetMob()[ n ]->GetSize().y / 2 - Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().y, 2 ) ); float tmpf = 1.f - tmp / 130.f; if( tmp < 130 ) { Game_Manager.GetMob()[ n ]->Defend( Game_Manager.GetPlayer()[ k ]->Attack() * tmpf ); if( Game_Manager.GetMob()[ n ]->GetHp() <= 0 ) { delete Game_Manager.GetMob()[ n ]; Game_Manager.GetMob().erase( Game_Manager.GetMob().begin() + n ); } } } } if( Game_Manager.GetMob()[ l ]->GetHp() <= 0 ) { delete Game_Manager.GetMob()[ l ]; Game_Manager.GetMob().erase( Game_Manager.GetMob().begin() + l ); } break; } }
Co się dzieje jest w kodzie opisane. Szwankuje "WADLIWA LINIJKA". Wiadomo, ma ona na celu zadanie usunąć moba z pamięci. Na pewno tam on bedzie bo pominąłem ryzyko dwukrotnej próby usuniącia ifem. Co dziwne program crashuje się od razu przy uruchomieniu, nie zdążam nic kliknąć. Co dziwne x2 na wersji debug działa, na release nie (używam C::B 13.12) |
|
DejaVu |
» 2014-05-05 18:55:39 Powód jest prosty: masz dwie pętle zagnieżdżone. W takiej sytuacji powinieneś oznaczać tylko i wyłącznie, że obiekt ma zostać zniszczony (jakaś zmienna typu bool wewnątrz obiektu), a po wykonaniu przetwarzania zrobić dodatkową pętlę która usunie obiekty oznaczone do skasowania. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-06 15:17:48 Dzięki za pomysł i rozwiązanie, zastosowałem to nie tylko dla mobów. Bądź co bądź mimo, że usuwam już wszystko deletem (moby, cząsteczki, obiekty(strzały czy inne) ) to nadal gdzieś jest wyciek tej pamięci. Nie wiem jak to określic ale na 2 min działania progamy (cały czas generuje czasteczki czy strzały lub moby) przybywa 200 kb. nie wiem czy to dużo i nigdzie nie moge zidentyfikować przyczyny, destruktory wszystkie działaja jak powinny. Zauważyłem chyba taką "zależność", że tej pamięci przybywa do pewnego stopnia. Nie wiem czy nie ma to związku z wektorem trzymającym wskaźnika na moby (ktory potem tej pamięci nie zwalnia), ale przeciez one są skasowane, więc takie troche jst to niedorzeczne.
PS: Nie w temacie, najwyżej utworze nowy, ale zna ktoś jakąś pomoc do napisania AI przy mapie kafelkowej 2d "z profilu" (cos jak mario)? |
|
Wrzud |
» 2014-05-06 16:53:58 Co do wycieków to.. valgrind w google :P |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-06 17:43:44 Dzięki, ale mam problem z uruchomieniem. Pobrałem, wchodze przez cmd do folderu głownego tego programu i wpisuje jak każą na stronie " valgrind --leak-check=yes myprog arg1 arg2 " pod myprog daje sciezke do mojego programu. klikam enter a emd pisze ze valgrind nie jest rozpoznawany.... cos zle robie? |
|
CodeMeister |
» 2014-05-06 23:50:11 a odpalasz go będąc w katalogu z valgrindem czy od razu po odpaleniu cmd? |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-07 13:26:58 wchodze przez cmd do folderu głownego tego programu |
wiec tak. tylko nie wiem czy mam być w głównym czy jeszcze w jakimś podfolderze |
|
1 2 3 « 4 » |