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

Postavljane pokazivaca na null u destruktoru!?

[es] :: C/C++ programiranje :: Postavljane pokazivaca na null u destruktoru!?

[ Pregleda: 2151 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

xploiter

Član broj: 119649
Poruke: 116
*.PPPoE-5972.sa.bih.net.ba.



+1 Profil

icon Postavljane pokazivaca na null u destruktoru!?29.10.2007. u 22:23 - pre 199 meseci
Imam problem u jednom programcicu u kojem se u desktruktoru prvo brisu pokazivaci pa se postavljaju na null. Ima nekih stvari koje nemaju veze sa pitanjem u kodu (ova referenca), ali to sam samo pisao onako u edukacione svrhe i da istrazujem, posto moram ovo utvrdid, jer sam sad zavrsio osnovno o pokazivacima, evo sad su na redu reference.

Pitanje:

Zar nebi trebao program da se srusi u liniji 55 gdje se pokusava pristupit pokazivacu its_age, odnosno promjenit njegova vrijednost, preko funkcije Set_age, jer je u liniji 54 pozvan destruktor u kojem se its_age postavlja na NULL, a pokazivac na NULL ne pokazuje na nista (koliko ja znam ), a u ovom slucaju ispada da pokazivac i nakon sto je inicijalizovan na null opet pokazuje na staru adresu (zar je to moguce???). Probavao sam jos svasta, ali imam osjecaj da kad se destruktor pozove da se pokazivac ne postavi na null kao sto bi trebalo po mom misljenju. Kada postavim frisky na null nakon brisanja frisky u 54 liniji program se srusi kao sto je i ocekivano...

Code:

#include <iostream>

class Cat

{
      private:
      
       int * its_age;

      
      
      
      public:
             
             Cat(int age) 
             {
             using namespace std;             
                       its_age = new int;
                       *its_age = age;
                       cout << "\n******Konstruktor*****\n";
                       }
            ~Cat() 
            {
            using namespace std;
            
                   delete its_age;
                   its_age = NULL;
                   cout << "****Destruktor*****\n";
                   }
                   
             int Get_age() {return *its_age;}
             void Set_age(int n_age) {*its_age =n_age;}
             
             };
             
             
int main()
      
      {
                using namespace std;
                
                Cat * frisky = new Cat(10);
                Cat &r_cat = *frisky;
                
                int x; 
                
                cout << "\nPreko pokazivaca: " << "frisky ima: " << frisky->Get_age() << " godina" << endl;
                cout << "Preko reference:" << "frisky ima: " << r_cat.Get_age() << " godina" << endl;
                cout << "Unesite godine za frisky: ";
                cin >> x;
                r_cat.Set_age(x);
                cout << "\nSada frisky ima: " << r_cat.Get_age() << " godina" << endl;                                                                                                       
                delete frisky;
                cout << "Unesite ponovo godine za frisky: ";
                cin >> x;
                frisky->Set_age(x);                                                                             //zar nebi trebao sad program da se srusi???
                cout << "\nSada frisky ima: " << frisky->Get_age() << " godina" << endl;   
                system ("pause");
return 0;
                }
 
Odgovor na temu

cbb
Marko Kovacevic
Beograd

Član broj: 156292
Poruke: 34
*.dip.t-dialin.net.



Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?29.10.2007. u 22:54 - pre 199 meseci
Pokazivac se postavi na NULL pri pozivanju destruktora (pogledaj u debug modu).
I program se srusi tacno gde treba, tj. u liniji "frisky->Set_age(x);".
Mozda ja nisam dobro razumeo tvoje pitanje.
 
Odgovor na temu

xploiter

Član broj: 119649
Poruke: 116
89.146.167.*



+1 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 08:35 - pre 199 meseci
Kada sam god prije pokusavao da pristupim null pokazivacu, da stavim vrijednost u njega, windows bi izbacio onu gresku send; dont send, ali samo u ovom slucaju program se izvrsi skroz do kraja kao da pokazivac nije postavljen na null.

Evo slika:


 
Odgovor na temu

cbb
Marko Kovacevic
Beograd

Član broj: 156292
Poruke: 34
*.dip.t-dialin.net.



Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 13:44 - pre 199 meseci
Postavi break point-e posle delete Frisky.
Ukljuci debug i prati sta se desava.
Kod koji si postovao kod mene radi bas kako je i ocekivano.

 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.demon.co.uk.



+4 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 15:42 - pre 199 meseci
Nije u pitanju problem u Debug modu, vec u Release modu (kad se program ne srushi)
Evo release moda (sve funkcije, ukljuchujuci i i tvoj 'delete' operator su inline-ovane od strane kompajlera, zato nema poziva tvojih metoda)
Code:

    delete frisky;
00401064  mov         ecx,dword ptr [esi] 
00401066  push        ecx  
00401067  call        operator delete (4010A6h) 
0040106C  push        esi  
0040106D  mov         dword ptr [esi],0 // !!!!!!!
00401073  call        operator delete (4010A6h) // !!!!!!
    //cout << "Unesite ponovo godine za frisky: ";
    //cin >> x;
    x=30;
    frisky->Set_age(x);                                                                             //zar nebi trebao sad program da se srusi???
00401078  mov         edx,dword ptr [esi] 
0040107A  add         esp,8 
0040107D  mov         dword ptr [edx],1Eh 


Linije oznachene znacima uzivka su tvoj problem - kompajler je obrnuo redosled poziva; kod prvo dodeli nulu pointeru ('esi' registar sadrzhi adresu instance klase, jedini chlan ti je pointer koji ujedno deli adresu pochetka objekta), ali nakon poziva 'delete' operatora taj deo memorije se zaprlja (tj. dobije ne-nultu vrednost). Set_age (zadnje tri linije) uzimaju tu novu adresu i (polu) legalno upisuju vrednost 1Eh (30 u C++ kodu) u tu lokaciju.

Da li je ovo greshka od strane kompajlera ili je problem u memory-manager-u (i da li je uopshte problem?) nemam vremena da istrazhujem, mozhda se javi neko sa konkretnijim odgovorom.

EDIT:
Ustvari, gledajuci u assembler sam zaboravio najvazhniju stvar - nemoj to da radish! Ovo je mozhda mentalna gimnastika, ali ono shto se nalazi u objektu nakon poziva 'delete' operatora (osim ako ga ne preklopish) nije vishe tvoj problem. U svakom sluchaju ne bi trebao da se igrash pointerima na vec obrisane objekte.

Time povlachim svoju prethodnu tvrdnju o "problemu u kompajleru ili mem. manageru" :)

[Ovu poruku je menjao NastyBoy dana 30.10.2007. u 17:14 GMT+1]
 
Odgovor na temu

yaelo
Rajko Vojnović
Beograd

Član broj: 78087
Poruke: 153
*.smin.sezampro.yu.



+9 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 17:20 - pre 199 meseci
Probaj da koristiš ovu funkciju.
Code:

template <typename T> inline void Delete (T*& ptr) {
    if (ptr) {
        delete ptr;
        ptr = 0;
    }
}


BTW Zašto koristiš reference na objekat koji se nalazi na heapu kada imaš pointer?
Takodje imaš problem sa NULL ptr frisky->Set_age(x); Obrisao si frisky sa delete frisky;
 
Odgovor na temu

xploiter

Član broj: 119649
Poruke: 116
*.PPPoE-83.sa.bih.net.ba.



+1 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 18:18 - pre 199 meseci
Zar nebi trebao da bude problem u destruktoru, ja sam samo koristio delete frisky; da bi se pozvao destruktor u kojem se brise i na NULL postavlja its_age, a kasnije se tom istom its_age-u koji je postavljen u destrukutoru na NULL pristupi bez problema kada Set_age-u predam x kao argument, a Set_age stavi vrijednost x-a u its_age koji je NULL!!! Moja poenta je da je nakon poziva destruktora nemoguce dodjeliti vrijednost its_age-u, a izgleda to ovdje ide bez problema.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?30.10.2007. u 19:23 - pre 199 meseci
Ti ne chitash prethodne postove?
 
Odgovor na temu

xploiter

Član broj: 119649
Poruke: 116
*.PPPoE-1290.sa.bih.net.ba.



+1 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?31.10.2007. u 08:44 - pre 199 meseci
E izvini, prvo nisam bio razumio nista sto si mi govorio, a li evo sad kad sam bolje procitao stvari su mi jasnije. Ali zasto se ovo meni samo dogadja?? cbb tvrdi da njemu ide kao sto je i ocekivano????
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.demon.co.uk.



+4 Profil

icon Re: Postavljane pokazivaca na null u destruktoru!?31.10.2007. u 11:56 - pre 199 meseci
"To" mozhe da se dogadja, ili ne, krajnje je nebitno. Poenta je da kad jednom unishtish objekat svako dalje igranje sa tim delom memorije je besmisleno.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Postavljane pokazivaca na null u destruktoru!?

[ Pregleda: 2151 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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