37 votos

Cómo intencionalmente eliminar un impulso::shared_ptr?

Tengo muchos, boost::shared_ptr<MyClass> objetos, y en algún momento me intencionalmente desea delete algunos de ellos para liberar algo de memoria. (Sé que en ese momento que nunca voy a necesitar de la punta de la-a MyClass objetos más.) ¿Cómo puedo hacer eso?

Supongo que no se puede simplemente llame a delete() con la cruda puntero que tengo 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 usarlo, y también se dice experimentales justo a su lado. (Creo que tengo el Impulso de 1.38.)

EDIT: tal vez simplemente asignar una nueva vacía boost::shared_ptr a la variable? Que debe tirar el viejo valor y eliminarlo.

69voto

Johannes Schaub - litb Puntos 256113

Usted acaba de hacer

ptr.reset();

Ver el shared_ptr manual. Es equivalente a

shared_ptr<T>().swap(ptr)

Llamar a reset en cada puntero inteligente que no debe hacer referencia al objeto más. El último ejemplo reset (o cualquier otra acción que hace que el número de referencia de bajar a cero, en realidad) hará que el objeto a ser libre ed el uso de la deleter automáticamente.

Tal vez usted está interesado en el Puntero Inteligente Técnicas de Programación. Tiene una entrada acerca de retraso desasignación.

6voto

j_random_hacker Puntos 28473

El punto entero de boost::shared_ptr<T> es que el pointee objeto será eliminado exactamente en el momento en el que no shared_ptr<T>s punto de eso -- es decir, cuando el último shared_ptr<T> que apunta a este objeto queda fuera del alcance o se reasigna a apuntar a un objeto diferente. Así que, todo lo que tienes que hacer para eliminar un objeto es asegurarse de que no hay shared_ptr<T>s apuntando hacia él. E. g. si sólo tiene un único shared_ptr<T> llamado p que apunta a un objeto, dejar que se quedan fuera de alcance, o llame a p.reset() (equivalente a p = NULL para un simple puntero), o asignarlo a un punto en algo más.

Si usted tiene dos shared_ptr<T>s apuntando hacia el objeto, necesita reasignar tanto de ellos.

EDIT: Gracias a dehmann por señalar que p = NULL; no es en realidad un código válido para un shared_ptr<T>... :)

5voto

John Morrison Puntos 287

Si usted quiere ser capaz intencionalmente eliminar objetos (yo lo hago todo el tiempo), entonces usted tiene que utilizar una sola propiedad. Usted ha sido engañado mediante shared_ptr cuando no es apropiado para su diseño.

3voto

chrish Puntos 1208

Lo que quiero hacer es volver referencias débiles uso de boost::weak_ptr que puede ser convertido a un shared_ptr cuando sea necesario. Esto puede permitir que para el control de la vida del objeto en el shared_ptr y aquellos que quieren acceder a él puede sostener en el weak_ptr y tratar de convertir a un shared_ptr. Si que convertir falla, entonces se puede volver a la consulta y traer el objeto en la memoria.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X