PDA

Visualizza la versione completa : [C/C++]: Dubbi su definizione di riferimento a oggetto


denis76
16-08-2006, 13:22
Che diffenenza c' tra queste 2 forme di definizione?

Oggetto oggetto;
oggetto.numero= 1;

Oggetto *oggetto= new Oggetto();
oggetto->numero= 1;

Grazie mille, Denis.

U-bahn
16-08-2006, 14:36
il primo una variabile (automatica) allocata staticamente:
la memoria occupata non viene liberata finch non esci dalla funzione
o dal blocco

il secondo un puntatore dinamico ad una locazione di memoria:
in questo caso, oggetto punta all'indirizzo ritornato
da new Oggetto();


Es.

Oggetto obj;
Oggetto *ptr;

obj.numero = 1;
ptr = &obj;
ptr->numero = 2;
cout << "obj: " << obj.numero << ", ptr: " << ptr->numero << endl;
obj.numero = 3;
cout << "obj: " << obj.numero << ", ptr: " << ptr->numero << endl;


:ciauz:

denis76
16-08-2006, 15:14
A per.

Per cui

Oggetto oggetto;
oggetto.numero= 1;

al termine della funzione la memoria viene liberata in automatico mentre

Oggetto *oggetto= new Oggetto();
oggetto->numero= 1;

al termine della funzione la memoria rimane occupata e si richiede l'uso del comando 'delete'.

Mi rimane da capire cosa serva '&'.

blulaserstar
16-08-2006, 15:28
serve perch un puntatore deve pur sempre puntare ad un indirizzo!
quindi a ptr (che nota non dereferenziato quindi non chiede un valore ma un indirizzo!)
assegni l'indirizzo dell'oggetto tramite la sintassi: &obj

Albertorrr
16-08-2006, 18:13
& lo usi come passaggio di una variabile per riferimento e nn per valore(dunque un altro metodo).
E' leggermente diverso da quest'ultimo, poich pi veloce(nn si nota ovviamente) in quanto nn fa una copia della variabile e ci accede direttamente.
Il tutto detto in poche parole.
A livello pratico cambia anche qualcosina, il valore della variabile passata per riferimento prende cm valore quello creato da una funzione e questo valore rimane tale anche all'uscita della funzione, quindi in fase 'pop' dello stack (si dice cosi, se nn sbaglio).

Ciao
A liv

XWolverineX
16-08-2006, 18:37
Bisogna ricordare che coi puntatori la memoria non viene liberata, ma il puntatore si, quindi state attenti.




void Block()
[
MioObj obj = new MioObj();
]


In questo caso come vedete non abbiamo liberato la memoria, quindi questa resta occupata, ma il puntatore va perso, quindi niente piu' punta alla memoria e quindi non pu piu' essere liberata
La memoria stata sprecata, o meglio, si avuto un memory leak.

Loading