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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top