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

użycie destruktora obiektu klasy powoduje błąd wykonania programu

Ostatnio zmodyfikowano 2012-02-14 15:38
Autor Wiadomość
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:
C/C++
class guzik {
public:
   
    guzik( SDL_Surface * destination = NULL ); //konstruktor
    ~guzik(); //destruktor
   
    //niektóre metody:
   
    void zniszcz_guzik() { this->~guzik(); };
   
private:
   
    //niektore pola klasy
   
    TTF_Font * font; //czcionka tekstu
    SDL_Surface * sTekst; //powierzchnia tekstu
   
   
};

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 ) { //pętla główna
        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?
P-50593
DejaVu
» 2012-02-12 19:56:29
C/C++
void zniszcz_guzik() { this->~guzik(); };
Destruktora się nie wywołuje ręcznie.
P-50595
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?
P-50596
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.
P-50597
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.
P-50598
DejaVu
» 2012-02-12 20:11:05
1 temat = 1 problem :) takie mamy zasady :P
P-50599
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..
P-50601
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.
P-50602
« 1 » 2
  Strona 1 z 2 Następna strona