mostrom Temat założony przez niniejszego użytkownika |
użycie destruktora obiektu klasy powoduje błąd wykonania programu » 2012-02-12 19:48:27 Witam! Mam niemały problem z destruktorem klasy. Sądzę, że jest tutaj potrzebny destruktor, bo klasa używa pól wskaźnikowych, które trzeba zniszczyć, żeby nie było wycieku pamięci. Pracuję z biblioteką SDL.
Na początku moja klasa:
class guzik { public: guzik( SDL_Surface * destination = NULL ); ~guzik(); void zniszcz_guzik() { this->~guzik(); }; private: TTF_Font * font; SDL_Surface * sTekst; };
guzik::~guzik() { TTF_CloseFont( font ); SDL_FreeSurface( sTekst ); }
int main( int argc, char * argv[] ) { init(); ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE ); guzik guz( ekran, 200, 300, 100, 25 ); guz.set_text( "zamknij" ); while( !zamknij ) { while( SDL_PollEvent( & event ) ) { if( guz.input( event, myszX, myszY ) ) zamknij = true; } guz.show( ekran ); SDL_Flip( ekran ); } guz_Wyjscie.close_button(); TTF_Quit(); SDL_Quit(); return 0; }
Po wywołaniu metody close_button, i zamknięciu programu codeblocks mówi mi: Process returned 139 (0x8B), zamiast Process returned 0;
Co jest źle w tym kodzie?
|
|
DejaVu |
» 2012-02-12 19:56:29 void zniszcz_guzik() { this->~guzik(); };
Destruktora się nie wywołuje ręcznie. |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2012-02-12 20:04:16 To w takim razie jest sens w powyższym przykładzie używać destruktora? bo we wszystkich kursach, w których czytałem destruktor jest wywoływany tylko dla wskaźników do obiektu poprzez słowo kluczowe delete. A ja nie definiuję obiektu jako wskaźnik, tylko jako zwykła zmienna. Proszę o jakieś rozjaśnienie :(
EDIT: Czy dobrze rozumuje, że destruktor jest wywoływany automatycznie po ostatnim użyciu obiektu? |
|
DejaVu |
» 2012-02-12 20:07:25 No to słabe kursy czytałeś :) Destruktor jest wywoływany kiedy obiekt jest niszczony. W przypadku gdy alokacja jest dynamiczna (poprzez operator new) to do zniszczenia obiektu dojdzie tylko i wyłącznie wtedy gdy będziesz usuwał obiekt poprzez wywołanie operatora delete na wskaźniku. Jeżeli jest to obiekt utworzony jak to ująłeś 'jako zwykła zmienna' to wówczas destruktor zostanie wywołany gdy będzie niszczona zmienna, czyli przy wyjściu ze scope-a. |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2012-02-12 20:10:26 Dzięki wielkie. Skoro tak się rzeczy mają, to co robią takie funkcje bliblioteki SDL jak SDL_FreeSurface(SDL_Surface * surf) ? Myślałem że uruchamiają właśnie destruktor. |
|
DejaVu |
» 2012-02-12 20:11:05 1 temat = 1 problem :) takie mamy zasady :P |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2012-02-12 20:18:32 Wracając do problemu nr 1 :p Nawet nie wywołując destruktora "ręcznie" program zwraca mi 139 (0x8B), zamiast 0. Jak dam w komentarz instrukcje destruktora: guzik::~guzik(){ // TTF_CloseFont(font); // SDL_FreeSurface(sTekst); } to jest dobrze, ale jak usunę komentarze, to coś się sypie. Sądzę, że to sprawa TTF_CloseFont(font); , bo jak zostawie samo SDL_FreeSurface, to zwraca mi 0 Pewnie usunięcie TTF_CloseFont będzie powodowało jakiś wyciek pamięci? lipa.. |
|
DejaVu |
» 2012-02-12 20:25:01 Sypie się z bardzo prostego powodu. Najpierw wywołuje się SDL_Quit, a dopiero potem wywołuje się destruktor, który korzysta z funkcji SDL. |
|
« 1 » 2 |