¿Cómo eliminar intencionalmente un boost :: shared_ptr?
-
05-07-2019 - |
Pregunta
Tengo muchos boost::shared_ptr<MyClass>
objetos, y en algún momento quiero intencionalmente delete
algunos de ellos para liberar algo de memoria. (Sé en ese momento que nunca más necesitaré los objetos apuntados a MyClass
.) ¿Cómo puedo hacer eso?
Supongo que no puedes llamar a delete()
con el puntero sin formato que obtengo con get()
.
He visto una función get_deleter(shared_ptr<T> const & p)
en boost::shared_ptr
, pero no estoy seguro de cómo usarla, y también dice experimental justo al lado. (Creo que tengo Boost 1.38.)
¿Quizás solo asigne un nuevo <=> vacío a la variable? Eso debería desechar el valor anterior y eliminarlo.
Solución
Acabas de hacer
ptr.reset();
Consulte el manual shared_ptr . Es equivalente a
shared_ptr<T>().swap(ptr)
Llama a reset
en cada puntero inteligente que ya no debería hacer referencia al objeto. La última <=> (o cualquier otra acción que haga que el recuento de referencia caiga a cero, en realidad) hará que el objeto se libere usando el eliminador automáticamente.
Quizás esté interesado en las Técnicas de programación de puntero inteligente . Tiene una entrada sobre desasignación diferida .
Otros consejos
Si desea poder eliminar objetos intencionalmente (lo hago todo el tiempo), entonces debe usar la propiedad única. Te han atraído a usar shared_ptr cuando no es apropiado para tu diseño.
El punto completo de boost::shared_ptr<T>
es que el objeto del puntero se eliminará exactamente en el momento en que no shared_ptr<T>
s lo señale, es decir, cuando el último p
señalador en este objeto sale del alcance o se reasigna para apuntar a un objeto diferente. Por lo tanto, todo lo que tiene que hacer para eliminar un objeto es asegurarse de que no hay p.reset()
s apuntando a él. P.ej. si solo tiene un p = NULL
llamado p = NULL;
apuntando a un objeto, déjelo caer fuera del alcance o llame al <=> (equivalente a <=> para un puntero simple), o asígnelo para que apunte a algo más.
Si tiene dos <=> s apuntando al objeto, deberá reasignarlos a ambos.
EDITAR: Gracias a dehmann por señalar que <=> en realidad no es un código válido para un <=> ... :)
Lo que desea hacer es devolver referencias débiles utilizando boost :: weak_ptr que se puede convertir a shared_ptr cuando sea necesario. Esto puede permitirle controlar la vida útil del objeto en shared_ptr y aquellos que quieran acceder a él pueden retener débil_ptr e intentar convertirlo en shared_ptr. Si esa conversión falla, pueden volver a consultar y devolver el objeto a la memoria.