¿Cómo eliminar intencionalmente un rpp boost::shared?


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

Supongo que no puedes simplemente llamar a delete() con el puntero raw 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 de ella. (Creo que tengo Impulso 1.38.)

Tal vez simplemente asigne un nuevo boost::shared_ptr vacío a la variable? Eso debería desechar el valor antiguo y eliminarlo.

Author: Sam, 2009-03-07

4 answers

Usted acaba de hacer

ptr.reset();

Ver 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 reset (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 deleter automáticamente.

Tal vez esté interesado en las Técnicas de Programación de Puntero Inteligente . Tiene una entrada sobre retrasada desasignación.

 82
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-23 23:05:23

Si desea poder eliminar objetos intencionalmente (lo hago todo el tiempo), debe usar propiedad única. Se le ha atraído a usar shared_ptr cuando no es apropiado para su diseño.

 9
Author: John Morrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-07 08:49:09

Todo el punto de boost::shared_ptr<T> es que el objeto puntiagudo se eliminará exactamente en el momento en que ningún shared_ptr<T> s lo apunte that es decir, cuando el último shared_ptr<T> que apunta a este objeto salga del ámbito o se reasigne 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 shared_ptr<T>s apuntando a él. Por ejemplo, si solo tiene un único shared_ptr<T> llamado p apuntando a un objeto, deje que caiga fuera del alcance, o llame a p.reset() (equivalente a p = NULL para un puntero simple), o asignarlo para apuntar a otra cosa.

Si tienes dos shared_ptr<T>s apuntando al objeto, necesitarás reasignar ambos.

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

 8
Author: j_random_hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 04:34:54

Lo que quiere hacer es devolver referencias débiles usando boost::weak_ptr que se pueden convertir a shared_ptr cuando sea necesario. Esto puede permitirle controlar la vida útil del objeto en el shared_ptr y aquellos que quieran acceder a él pueden mantener el weak_ptr e intentar convertirlo a un shared_ptr. Si esa conversión falla, pueden volver a consultar y devolver el objeto a la memoria.

 4
Author: chrish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-18 03:48:56