[ Fidelito_Castro @ 29.04.2008. 23:26 ] @
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;
}

[ karas @ 30.04.2008. 00:01 ] @
1) Destruktor se poziva kada se objekat uništava, jedan od slučajeva je kada se poziva delete.
2) Da.
[ Fidelito_Castro @ 30.04.2008. 00:11 ] @
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?
[ karas @ 30.04.2008. 04:59 ] @
Da, objekat na heap-u se stvara sa new (odgovarajući konstruktor se poziva) i uništava sa delete (poziva se destruktor).
[ Mr.Plague @ 08.11.2008. 19:57 ] @
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]
[ X Files @ 08.11.2008. 20:16 ] @
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

[ Mr.Plague @ 08.11.2008. 20:48 ] @
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?
[ john_doe_nnn @ 09.11.2008. 08:35 ] @
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.
[ X Files @ 09.11.2008. 09:07 ] @
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