Che diffenenza c'è tra queste 2 forme di definizione?
Oggetto oggetto;
oggetto.numero= 1;
Oggetto *oggetto= new Oggetto();
oggetto->numero= 1;
Grazie mille, Denis.
Che diffenenza c'è tra queste 2 forme di definizione?
Oggetto oggetto;
oggetto.numero= 1;
Oggetto *oggetto= new Oggetto();
oggetto->numero= 1;
Grazie mille, Denis.
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();
codice: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;
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 '&'.
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
& 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
Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it
Bisogna ricordare che coi puntatori la memoria non viene liberata, ma il puntatore si, quindi state attenti.
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 liberatacodice:void Block() [ MioObj obj = new MioObj(); ]
La memoria è stata sprecata, o meglio, si è avuto un memory leak.
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog