Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Destruktor nad dinamickim objektima?

[es] :: C/C++ programiranje :: C/C++ za početnike :: Destruktor nad dinamickim objektima?

[ Pregleda: 2867 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Fidelito_Castro
Fidelito_Castro
Subotica

Član broj: 143557
Poruke: 87
*.eunet.yu.



Profil

icon Destruktor nad dinamickim objektima?29.04.2008. u 23:26 - pre 194 meseci
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;
}

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Destruktor nad dinamickim objektima?30.04.2008. u 00:01 - pre 194 meseci
1) Destruktor se poziva kada se objekat uništava, jedan od slučajeva je kada se poziva delete.
2) Da.
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."
 
Odgovor na temu

Fidelito_Castro
Fidelito_Castro
Subotica

Član broj: 143557
Poruke: 87
*.eunet.yu.



Profil

icon Re: Destruktor nad dinamickim objektima?30.04.2008. u 00:11 - pre 194 meseci
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?
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Destruktor nad dinamickim objektima?30.04.2008. u 04:59 - pre 194 meseci
Da, objekat na heap-u se stvara sa new (odgovarajući konstruktor se poziva) i uništava sa delete (poziva se destruktor).

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."
 
Odgovor na temu

Mr.Plague
Student
Beograd

Član broj: 200620
Poruke: 2
*.dynamic.sbb.rs.



Profil

icon Re: Destruktor nad dinamickim objektima?08.11.2008. u 19:57 - pre 188 meseci
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]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Destruktor nad dinamickim objektima?08.11.2008. u 20:16 - pre 188 meseci
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

 
Odgovor na temu

Mr.Plague
Student
Beograd

Član broj: 200620
Poruke: 2
*.dynamic.sbb.rs.



Profil

icon Re: Destruktor nad dinamickim objektima?08.11.2008. u 20:48 - pre 188 meseci
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?
 
Odgovor na temu

john_doe_nnn
bolnica,bolnica
Zagreb

Član broj: 200659
Poruke: 1
..156.217-dsl.net.metronet.hr.



Profil

icon Re: Destruktor nad dinamickim objektima?09.11.2008. u 08:35 - pre 188 meseci
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.

NN
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Destruktor nad dinamickim objektima?09.11.2008. u 09:07 - pre 188 meseci
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
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Destruktor nad dinamickim objektima?

[ Pregleda: 2867 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.