Pregunta

En mi proyecto actual que estoy usando boost::shared_ptr sobradamente.

Hace poco, mis compañeros compañeros también han empezado a utilizar weak_ptr. No sé cuál usar y cuándo.

Además de esto, ¿qué debo hacer si quiero convertir a weak_ptr shared_ptr. No poner un candado en weak_ptr para crear un shared_ptr afecta mi código en otro hilo?

¿Fue útil?

Solución

En general y resumida,

punteros fuertes garantizar su propia validez. Utilizarlos, por ejemplo, cuando:

  • Usted es propietario del objeto que se está apuntando a; crear y destruirlo
  • Usted no tiene definido el comportamiento si el objeto no existe
  • Es necesario para hacer cumplir que el objeto existe.

punteros débiles garantía de sabiendo su propia validez. Utilizarlos, por ejemplo, cuando:

  • Se accede a ella, pero no es el suyo.
  • Se ha definido el comportamiento si el objeto no existe

Lock () en un puntero débil devuelve un puntero fuerte; esta es la forma en que acceda al puntero débil. Si el objeto ya no es válida (que ha sido eliminado, etc), entonces el puntero fuerte será nulo, de lo contrario, será el punto en el objeto. Usted tendrá que comprobar esto.

Está configurado de esta manera por lo que no se puede eliminar accidentalmente el objeto mientras se está usando, porque se ha hecho un puntero fuerte (local) temporal, y por lo tanto garunteed la existencia del objeto, mientras que el puntero sigue siendo fuerte. Cuando haya terminado de utilizar el objeto, por lo general, dejó caer el puntero fuerte fuera de alcance (o reasignación de ella), que a su vez permite que el objeto que desea eliminar. Para multihilo, tratarlos con mismo cuidado que trata a otras cosas que no se han incorporado en hilo de seguridad, teniendo en cuenta que la garantía que he mencionado anteriormente cuando mantenga multithreading. Que yo sepa no hacen nada especial allá de eso.

Los punteros impulsar compartida también tienen liberador de memoria como características, ya que cuando el último fuerte puntero a un objeto desaparece o puntos en otro lugar, el objeto se elimina.

Hay también el rendimiento y dependencias circulares mencionado en otras respuestas.

En el fondo, yo diría que la biblioteca compartida puntero del impulso le permite no desordenar la elaboración de un programa, pero no es un sustituto para tomar el tiempo para diseñar correctamente los punteros, titularidades de objetos y tiempos de vida. Si usted tiene un diseño de este tipo, puede utilizar la biblioteca para hacerla cumplir. Si usted no tiene un diseño tal, es muy probable encontrarse con diferentes problemas que antes.

Otros consejos

Uso weak_ptr cuando los objetos se crean contienen referencias cíclicas, es decir shared_ptr a un objeto con un shared_ptr de nuevo a sí mismo. Esto se debe a shared_ptr no puede manejar las referencias cíclicas - cuando ambos objetos salen de su alcance, la referencia recíproca significa que no son "recolector de basura", por lo que se pierde la memoria y tiene una pérdida de memoria. Desde weak_ptr no incrementa el contador de referencia, no se produce el problema de referencia cíclica. Esto también significa que, en general, si lo que desea es tomar un puntero a algo que es contado de referencia y no quieren aumentar su contador de referencia, a continuación, utilizar weak_ptr.

De lo contrario, puede utilizar shared_ptr.

Para obtener más información, consulte el refuerzo documentación .

punteros compartidos implementar el recuento de referencias, los punteros débiles no afectan el recuento de referencias y si aún no ha compartido punteros a un objeto, punteros única débiles, el objeto se elimina y los punteros débiles ahora le dicen que el objeto se ha perdido .

Hay dos razones para utilizar un puntero débil:

  1. Para eliminar el costo de la cuenta de referencia aumento / disminución; sin embargo no se debe hacer esto porque es propenso a errores y realmente no ahorrar mucho tiempo
  2. En las estructuras de datos de contabilidad, por ejemplo que tiene un índice de todos los objetos que son Foo "vivo", es decir, se utilizan en otro lugar, y no desea mantener un Foo con vida en el índice si todos los usos "reales" han terminado. Este es el caso de uso realistas básica para los punteros débiles. Por supuesto, existen otros también.

Así que, en general, mi recomendación sería utilizar punteros débiles sólo cuando sepa que desea que los objetos referenciados se eliminarán y quiere detectar eso. En otros casos utilizar punteros compartidos (contaje de referencia), o punteros directos, esp. en las variables locales del método cuando se sabe que los objetos no van a ser eliminado. También errorprone, sin embargo, pero más rápido que los punteros compartida.

N.B. cíclicas objetos no necesitan punteros débiles, puede utilizar no cocinados, punteros regulares en lugar de programas más adecuadamente construidos. punteros débiles de menor riesgo, sin embargo.

Debe probablemente no estar tratando de utilizar punteros débiles en absoluto a menos que usted está tratando de implementar un recolector de basura, que no es una idea caliente en C ++ porque es muy difícil hacer un seguimiento de todo lo que podía salir mal con suficiente atención.

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