Existen algunos casos muy raros en los que es posible que no pueda usar un puntero inteligente (probablemente se trata de un código anterior), pero tampoco puede usar un esquema simple de "propiedad".
Imagine que tiene un std::vector<whatever*>
y algunos de los whatever*
punteros apuntan al mismo objeto. La limpieza segura implica asegurarse de no eliminar el mismo elemento dos veces, de modo que construya un std::set<whatever*>
sobre la marcha, y solo elimine los punteros que aún no están en el conjunto. Una vez que se han eliminado todos los objetos apuntados, ambos contenedores también se pueden eliminar de forma segura.
El valor de retorno de insert
se puede utilizar para determinar si el elemento insertado era nuevo o no. No he probado el siguiente (o usado std :: set por un tiempo), pero creo que lo siguiente es correcto ...
if (myset.insert (pointervalue).second)
{
// Value was successfully inserted as a new item
delete pointervalue;
}
No debe diseñar proyectos de manera que esto es necesario, por supuesto, pero no es demasiado difícil lidiar con la situación si no puedes evitarlo.
¿No debería funcionar? delete null se especifica en el estándar, por lo que permitió y debería funcionar. De acuerdo, no es el mejor estilo de codificación ... –
@Mario: Eliminar NULL se especifica como NO-OP, pero llamarlo genera cierta sobrecarga. –
El problema es q yp no será NULO, por lo que habrá doble eliminación. –