• 8 odgovora
  • 3.952 pregleda
Destruktor nad dinamickim objektima? 29.04.2008. u 23:26 · pre 225 meseci #1
Pozdrav svima! Imam dva pitanja u vezi sa unistavanjem(dealokacijom) dinamickih objekata.

1)Da li kompajler obezbedjuje podrazumevani destruktor kod unistavanja dinamickih objekata,odnosno da li se destruktor
za dinamicke objekte poziva tek nakon primene C++ -ovog unarnog operatora delete ?
2)Da li alociran prostor u heap segmentu memorije se unistava nakon izlaza iz programa?(pretpostavljam da to unistava OS?)

Unapred zahvalan i svako dobro!

Evo i jednog primera:
Code:

#include <iostream>
#include <string>

using namespace std;
//definicija klase Primer
class Primer
{
    protected:
        string name;
    public:
        Primer(string ime):name(ime)
        {cout<<"Konstruktor Primer"<<endl;}
        virtual ~Primer(){cout<<"Destruktor Primer"<<endl;}
        virtual string Tekst(){return name;}

};
//Javno izvedena klasa Primer2
class Primer2 : public Primer
{
    protected:
        string surname;
    public:
        Primer2(string prez):Primer("Primer2"),surname(prez)
        {cout<<"Konstruktor Primer2"<<endl;}
        ~Primer2(){cout<<"Destruktor Primer2"<<endl;}
        string Tekst(){return surname;}
};
int main()
{
    Primer* p_objekat = new Primer2("Petrovic");

    cout<<endl;

    //Ispisuje da je destruktor izvrsen tek nakon naredbe
    //delete p_objekat;   ???


    system("PAUSE");
    return  0;
}

Re: Destruktor nad dinamickim objektima? 30.04.2008. u 00:01 · pre 225 meseci #2
1) Destruktor se poziva kada se objekat uništava, jedan od slučajeva je kada se poziva delete.
2) Da.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Destruktor nad dinamickim objektima? 30.04.2008. u 00:11 · pre 225 meseci #3
Hvala na brzom odgovoru.
Inace rezumeo sam da se destruktor izvrsava za unistavanje objekata tipa klasa.Mene interesuje da li se destruktor
za objekte kreirane u dinamickoj zoni memorije iskljucivo izvrsava pozivom operatora delete?
Re: Destruktor nad dinamickim objektima? 30.04.2008. u 04:59 · pre 225 meseci #4
Da, objekat na heap-u se stvara sa new (odgovarajući konstruktor se poziva) i uništava sa delete (poziva se destruktor).
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Destruktor nad dinamickim objektima? 08.11.2008. u 19:57 · pre 218 meseci #5
Imam pitanje.
Kreiram dinamicki objekat u funkciji, pali se konstruktor i kreira se dinamicka promenljiva. Zatim brisem objekat,
pali se destruktor i u njemu se brise dinamicka promenljiva.
E sad, jel se poziva ponovo destruktor pri izlasku iz te funkcije, odnosno dal ponovo dolazi do brisanja te dinamicke promenljive?
Code:

class Klasa
{
public:
    Klasa(int broj) { p = new int(broj); }
    ~Klasa() { delete p; }    
private:
    int *p;
};

void funkcija(void);

int main()
{
           funkcija();
           return 0;
}

void funkcija(void)
{
           Klasa *obj = new Klasa(2);
           delete obj;
}


EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]
Re: Destruktor nad dinamickim objektima? 08.11.2008. u 20:16 · pre 218 meseci #6
U tvom primeru i konstruktor i destruktor se pozivaju naravno po jednom, bez obzira na izlazak iz tela funkcije. Uostalom probaj sam i pogledaj rezultate, prethodno malo izmeni kod da imas ispise na ekran:
Code:

// ...
    Klasa(int broj) { p = new int(broj); printf("Konstruktor!\n"); }
    ~Klasa() { delete p; printf("Destruktor!\n"); }
// ...


Izlazak iz scope-a (konkretno, tela funkcije) nece automatski uticati na pozivanje destruktora kada su objekti kreirani na heap-u (sa new):
Code:

void funkcija(void)
{
        Klasa *obj = new Klasa(2); // <--- Objekat na heap-u, kreiran sa new
        delete obj; // <--- sami smo odgovorni za unistenje, treba delete
}

(to moras sa delete, kao sto si i uradio)

Ono sto je tebe mozda zbunilo je kreiranje objekata na stack-u, kada ce destruktor objekta biti pozvan automatski nakon izlaska iz scope-a:
Code:

void funkcija(void)
{
        Klasa obj(2); // <--- Objekat je na stack-u
} // <--- Destruktor ce biti pozvan automatski pri izlasku iz oblasti vazenja, proveri na svom kodu sa ispisima na ekran

Re: Destruktor nad dinamickim objektima? 08.11.2008. u 20:48 · pre 218 meseci #7
Aha, hvala. Pa da, mislio sam da će destruktor ponovo biti pozvan izlaskom iz funkcije. Odnosno jednom sa delete, a drugi put automatski. I da će dvaput pokušati da obriše "p", a pročitao sam da se to ne sme raditi.

Znači, nikad ne dolazi do automatskog poziva destruktora izlaskom iz funkcije ako je kreiranje na heap-u?
Re: Destruktor nad dinamickim objektima? 09.11.2008. u 08:35 · pre 218 meseci #8
Evo samo pokazni kod kako i koliko se poziva konstruktor i destruktor.
Samo jednom sve.

Code:

#include<iostream>
using namespace std;


  class Klasa
{
public:
    Klasa(int broj) 
    {
        
        cout<<"Sad smo u konstruktoru  :"<<(int)this<<endl;
        p = new int(broj); 
    }
    ~Klasa() 
    {
        cout<<"Sad smo u destruktoru  :"<<(int)this<<endl;
        delete p;
    }    
private:
    int *p;
};

void funkcija(void);

int main()
{
           funkcija();
           return 0;
}

void funkcija(void)
{
           Klasa *obj = new Klasa(2);
           delete obj;
}



this se odnosi na klasu .
Kompajlaj to i vidjet češ da se konstruktor poziva jednom i destruktor jednom za istu adresu.
Ako stvoriš više konstruktora i destruktora svi se uništavaju obrnutim redoslijedom.
Potpis
NN
Re: Destruktor nad dinamickim objektima? 09.11.2008. u 09:07 · pre 218 meseci #9
Citat:

Znači, nikad ne dolazi do automatskog poziva destruktora izlaskom iz funkcije ako je kreiranje na heap-u?

Vrlo bitni koncepti C++ jezika zasnivaju se na garanciji da će (uprošćno rečeno) objekat na stack-u biti uništen (pozvan destruktor) čim bude izašao iz oblasti važenja, kao na primer takozvana RAII tehnika:
http://en.wikipedia.org/wiki/R..._Acquisition_Is_Initialization
http://www.efnetcpp.org/wiki/RAII
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme