Nel mio programma C++, creo oggetti in una funzione usando new. Questi oggetti sono inseriti in un set. Quando voglio rimuovere oggetti dal set, utilizzo un iteratore in un ciclo for. Quando rimuovo l'oggetto dall'insieme, devo ancora cancellare l'oggetto per liberare la sua memoria, corretto? Ho provato a usare delete, ma poi ho ricevuto un errore che diceva che il puntatore che veniva liberato non era allocato. Quindi, come può essere fatto?Come eliminare un oggetto in un set
Ecco il codice dove Creo l'oggetto e inserirla nella serie
set <myObject> myobjectlist;
myObject *myobject = new myObject;
myobjectlist.insert(*myobject);
In un'altra funzione, provo a rimuovere un oggetto dal set, e senza la sua memoria:
for (set<myObject>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++)
if (i->myObjectID == myObjectID)
{
myobjectlist.erase(*i);
delete &i;
break;
}
Questo funziona perfettamente senza la parte 'cancella'. L'ho aggiunto perché pensavo che la memoria dell'oggetto non venisse liberata.
In base al suo frammento di codice questa affermazione è fuorviante. Il suo set memorizza l'oggetto in base al valore, quindi ciò che cancella sta distruggendo non è ciò che ha assegnato con nuovo. – hifier
No, perché sta eliminando per riferimento questo non è il caso. Il suo set contiene una copia del valore dell'oggetto originale, che viene quindi trovato. Il valore viene cancellato (e distrutto) dall'insieme e quindi si tenta di eliminare l'iteratore, che non funzionerà, poiché non punta più a un blocco valido. –
Il suo codice non tenta di eliminare l'iteratore, tenta di eliminare _address_ dell'iteratore (che è ancora un indirizzo valido, ma non uno che contiene un puntatore a qualcosa che è stato allocato con nuovo). Ma non è questo il punto, il codice perderà l'oggetto originale. – hifier