En mi programa C++, creo objetos en una función usando new. Estos objetos se insertan en un conjunto. Cuando quiero eliminar objetos del conjunto, utilizo un iterador en un for-loop. Cuando elimino el objeto del conjunto, aún necesito eliminar el objeto para liberar su memoria, ¿correcto? Intenté usar delete, pero luego recibí un error que decía que el puntero que se liberaba no estaba asignado. Entonces, ¿cómo puede hacerse esto?Cómo eliminar un objeto en un conjunto
Aquí es el código en la que se crea el objeto y luego insertarlo en el conjunto
set <myObject> myobjectlist;
myObject *myobject = new myObject;
myobjectlist.insert(*myobject);
En otra función, trato de sacar un objeto del conjunto, y libre de su memoria:
for (set<myObject>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++)
if (i->myObjectID == myObjectID)
{
myobjectlist.erase(*i);
delete &i;
break;
}
Esto funciona bien sin la parte 'eliminar'. Lo agregué porque pensé que la memoria del objeto no se estaba liberando.
Según su fragmento de código, esta afirmación es engañosa. Su conjunto almacena el objeto por valor, así que lo que borra es destructivo no es lo que asignó con el nuevo. – hifier
No, porque está borrando por referencia este no es el caso. Su conjunto contiene una copia del valor de su objeto original, que luego se encuentra. El valor se borra (y se destruye) del conjunto, y luego se intenta eliminar el iterador, lo que no funcionará, ya que ya no apunta a un bloque válido. –
Su código no intenta eliminar el iterador, intenta eliminar la _address_ del iterador (que sigue siendo una dirección válida, simplemente no una que contiene un puntero a algo que se asignó con new). Pero este no es el punto, el código filtrará el objeto original. – hifier