|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
[C++] Chiamare delete su un iterator
Sono sempre dietro a fare esercizi in C++, non credo di aver capito bene cosa faccia questo codice (l'ultimo for):
Codice:
vector<MyClass*> elements;
for( int i=0; i < 512; ++i )
elements.push_back(new MyClass);
for( vector<MyClass*>::iterator j = elements.begin(); j != elements.end(); ++j )
delete *j;
Quel che so è che gli iterator sono puntatori, dunque j è un puntatore a oggett MyClass*. Quando eseguo delete *j quindi sto dicendo di liberare lo spazio in memoria dell'oggetto MyClass* che, per quel che ne so, dovrebbero essere gli elementi dentro al vettore. So che l'intero ciclo for può essere eliminato e può essere richiamato semplicemente empty() sul vettore se l'obietto è solo svuotarlo ma in questo caso i distruttori non vengono richiamati ed io ho bisogno di farlo. Cercando su internet ho trovato che la soluzione potrebbe essere: Codice:
delete * j; j = elements.erase(j); Ultima modifica di -Ivan- : 18-11-2013 alle 13:59. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
for ([...]) delete *j; elements.empty(); // (se empty fa quel che dici, non ricordo ma mi fido). Il perchè è: con lo statement delete cosa fai? Ottieni l'oggetto corrispondente all'iteratore, con l'operatore di dereferenziazione, che è un puntatore ad oggetto, poi chiami il delete su quel puntatore, quindi liberi la heap (la memoria dinamica) dall'oggetto puntato dal puntatore. Cioè Codice:
delete *j; Codice:
MyClass* tempPointer = *j; delete tempPointer; A questo punto con elements.empty cancelli dalla memoria tutti gli elementi del vettore, cioè i puntatori a oggetti MyClass che non puntano più a niente. Claro? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:02.





















