Pregunta

Estoy usando punteros Boost / shared_ptr lo largo de mi solicitud. Cuando se libera la última referencia a un objeto, shared_ptr se elimine el objeto para mí. Los objetos de la aplicación se suscribe a eventos en una ubicación central de la aplicación, similar a la / patrón observador abonado.

En los destructores de objetos, el objeto se darse de baja en sí de la lista de suscripciones. La lista de suscripciones es esencialmente sólo un list<weak_ptr<MyObject> >. Lo que quiero hacer es algo similar a esto:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

Mi problema aquí es que shared_from_this no pueden ser llamados en los destructores por lo que el código anterior lanzar una excepción.

En mi antigua aplicación, la lista de suscripción fue sólo una lista de punteros y luego funcionó. Pero quiero usar weak_ptr referencias en lugar de reducir el riesgo de mí para atornillar la memoria de gestión de memoria manual.

Desde que se basan en shared_ptr hacer la eliminación del objeto, no hay ni un solo lugar en mi código donde lógicamente puedo realizar una llamada a darse de baja.

¿Alguna idea sobre qué hacer en esta situación?

¿Fue útil?

Solución

  1. Puede destruir los objetos a través de suscripción ejemplo, entonces va a eliminar automáticamente los punteros.
  2. Usted puede olvidarse de sacarlos de suscripciones -. Planteo del weak_ptr poder ser bloqueado de todos modos, a continuación, se pueden quitar
  3. Se puede asignar un identificador único a cada objeto y luego eliminar a través de la identificación única no es el shared_ptr
  4. Puede pasar un puntero normal de quitar en lugar de una responsabilidad compartida - que servirá como un "ID".

Otros consejos

  

Mi problema aquí es que shared_from_this no puede ser llamado en   destructores por lo que el código anterior se producirá una excepción.

Se producirá una excepción ya está caducado , por definición, en un destructor.

Entonces, ¿qué es lo que quieres de todos modos? Un puntero "caducado" compartida? Basta con crear un puntero compartida vacía.

o un puntero débil expirado?

Tal vez si se observa que el "problema" no está shared_from_this tirar (que es un síntoma), pero todos los propietarios de siendo intrínsecamente ya restablecer o destruido en ese punto y los punteros débiles se venció y equivalente a un defecto vacío creado puntero débil (*), por lo que sólo debe pasar un defecto inicializa el puntero débil.

También Subscriptions::Instance()->Remove(weak_OR_owning_pointer) no tiene sentido de cualquier manera (ya sea con puntero débil o poseer) como no se puede comparar un puntero débil para nada, sólo se puede tratar de bloquearlo (y luego hacer una comparación).

Por lo que sólo puede quitar punteros débiles caducados. Los argumentos de Remove es inútil.

(*) O eso, o que tenga una muy seria doble fallo de la doble propiedad del objeto que está siendo destruido!

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