[ azzpoz @ 21.10.2013. 19:01 ] @
Code:
class Osoba
{
    char ime[200];
    char JMBG[14];
};

class Profesor:public Osoba
{
    char titula[15];
    char naslovDisertacije[50];
};

class Student:public Osoba
{
    int indeks;
}




int main()
{

Osoba *p = new Student;
           p = new Profesor;
}


MAIN():

Osoba *p = new Student;
 p = new Profesor;



Interesuje me, da li pokazivač tipa "Osoba", kreira Student(memoriju potrebnu za tu klasu), zatim kreira Profesor(memoriju potrebnu za tu klasu)?
Na koga pokazivač ' p ' pokazuje poslije p = new Profesor?
Da li pokazuje samo na Profesor ili na oba?


[Ovu poruku je menjao azzpoz dana 22.10.2013. u 23:12 GMT+1]
[ X Files @ 21.10.2013. 21:16 ] @
Prvo treba da razumeš šta je zapravo "p". "p" je jedna obična memorijska adresa (najčešće od 4 bajta) koja će svojom vrednošću pokazivati na "veći blok" podataka koji kreiraš sa "new", tamo gde odredi računar. Dakle, uloga "p"-a je samo da pokaže gde je u memoriji rezervisan prostor za novokreirani objekat.

Posle prvog "new", tvoj "p" pokazuje na blok podataka "Student". Tada možeš da vršiš dodelu, možeš da ispisuješ vrednosti i sl.

Međutim, ti "bacaš u vodu" taj blok podataka koji počinje na adresi "p", i preko ponovnog "new" dodeljuješ "p"-u novi blok podataka, koji ovoga puta čuva adresu bloka podataka "Profesor". Zauvek si izgubio gde se nalazi stari blok podataka "Student", a i zarobio si njime memoriju, jer prethodno nisi uništio objekat koji ti više ne treba.


Ili prethodno uništavaj kreirani objekat sa "delete", ili napravi niz pokazivača, npr. tako da prvi pokazuje na p[0], a drugi na p[1]. Jedan "p" ne može da čuva dve adrese. Samo jednu.
[ Rapaic Rajko @ 22.10.2013. 08:42 ] @
Sto bi rekli, ono gore je klasican primer curenja (leaking) memorije. Ponekad je greske tog tipa bas tesko naci, kad je projekat ogroman itd.

Pozz
[ Nedeljko @ 22.10.2013. 12:40 ] @
A ponekad se automatski izbegnu upotrebom pametnih pokazivača.
[ Rapaic Rajko @ 22.10.2013. 13:34 ] @
Molim pojasnjenje termina "pametni pokazivaci"...? Hvala!

Pozz
[ Nedeljko @ 22.10.2013. 17:27 ] @
Ima ih nekoliko vrsta i svi su šabloni, kojima se tip pokazivanog objekata prosleđuje kao parametar (npr. ato_ptr<int>).

1. auto_ptr

Obezbeđuje uništavanje objekata i prilikom kopiranja/dodele, pokazivač koji je dodeljivan dobija vrednost 0, tj. posle a=b je b==0. Koristi se kada ne može više od jednog pokazivača u isto vreme da pokatzuje na isti objekat.

2. intrusive_ptr

Obezbeđuje uništavanje objekata brojanjem referenci iako može više pokazivača da pokazuje na iosti objekat. Mana mu je da pokazivani objekat može biti konstruisan samo podrazumevanim konstruktorom ili konstruktorom kopije, osim ako je pravljen specijalno za jedan tip, pa ima još neke konstruktore. Takođe, mana mu je da ne sme imati kružnih referenci. To je situacija gde objekat a sadrži pokazivač koji pokazuje na objekat b, a objekat b sadrži pokaziovač koji pokazuje na a, s tim da situacija može biti i složenija (a pokazuje na b, b pokazuje na c, c pokazuje na d, a d pokazuje na a).

3. shared_ptr

Slično kao intrusive_ptr, ali se pokazivani objekat može konstruisati bilo kojim konstruktorom. Takođe, malo je manje efikasan od intrusive_ptr.

4. weak_ptr

Koristi se u kombinaciji sa shared_ptr za izbegavanje kružnih referenci. Nije primenljiv u kombinaciji sa intrusive_ptr.

5. unique_ptr

Naprednija zamena za auto_ptr. Jedina mana mu je da se može koristiti samo sa novijim kompajlerima koji podržavaju semantiku pomeranja (move semantic) iz najnovijeg standarda - C++11.
[ deerbeer @ 22.10.2013. 19:01 ] @
Citat:
4. weak_ptr
Koristi se u kombinaciji sa shared_ptr za izbegavanje kružnih referenci. Nije primenljiv u kombinaciji sa intrusive_ptr.

Mala dopuna:

shared_ptr i weak_ptr su usko povezani tako sto se weak_ptr moze inicijalizovati samo iz shared_ptr a on ce i dalje imati puno vlasnistvo nad pravim pointerom(objektom),
s tim sto ce objekat biti obrisan ako je zadnja referenca koji brojac od shared_ptr-a drzi bude upravo weak_ptr .
Zato se pri koriscenju weak_ptr-a uvek prvo mora testirati validnost pointera(objekta) u slucaju da ga shared_ptr obrise.
[ azzpoz @ 22.10.2013. 22:14 ] @
Citat:
X Files:
Prvo treba da razumeš šta je zapravo "p". "p" je jedna obična memorijska adresa (najčešće od 4 bajta) koja će svojom vrednošću pokazivati na "veći blok" podataka koji kreiraš sa "new", tamo gde odredi računar. Dakle, uloga "p"-a je samo da pokaže gde je u memoriji rezervisan prostor za novokreirani objekat.

Posle prvog "new", tvoj "p" pokazuje na blok podataka "Student". Tada možeš da vršiš dodelu, možeš da ispisuješ vrednosti i sl.

Međutim, ti "bacaš u vodu" taj blok podataka koji počinje na adresi "p", i preko ponovnog "new" dodeljuješ "p"-u novi blok podataka, koji ovoga puta čuva adresu bloka podataka "Profesor". Zauvek si izgubio gde se nalazi stari blok podataka "Student", a i zarobio si njime memoriju, jer prethodno nisi uništio objekat koji ti više ne treba.


Ili prethodno uništavaj kreirani objekat sa "delete", ili napravi niz pokazivača, npr. tako da prvi pokazuje na p[0], a drugi na p[1]. Jedan "p" ne može da čuva dve adrese. Samo jednu.



Ako sam dobro razumio(a želim da ne ostaju dileme vezano za početak učenja klasa, ...) moj ' p ' će samo da pokazuje na " Profesor ", a " Student " je izgubljen i bespotrebno zauzima dio u memoriji?



Hvala!!!
[ X Files @ 23.10.2013. 07:17 ] @
Da, tako je.

Pogledaj ovaj izraz iz tvog koda:
Osoba *p = new Student;

Pojednostavljeno rečeno, new ima dvojaku ulogu:
1) Na osnovu definicije klase Student, new zna koliko prostora u memoriji treba rezervisati klasi. Zatim traži u memoriji slobodan prostor za tvoj objekat. Kada ga pronađe, smešta tu objekat...
2) ... a tebi daje informaciju gde je početak tog bloka memorije ( p ), kako bi mogao dalje da njime upravljaš.

Kompajler ne zanimaju razlozi zašto je programer (namerno ili slučajno) "overwrite"-ovao p, i tako izgubio informaciju gde je početak nekog bloka podataka :)

U ovom trenutku nije loše da pogledaš šta su to "reference" u programskom jeziku C++. Na primer Googluj: references vs pointers
[ Rapaic Rajko @ 23.10.2013. 14:11 ] @
Zaista iscrpno pojasnjenje 'pametnih pointera'- hvala!

Pozz