2012-09-14 17 views
16

Estoy trabajando con std::shared_ptr y durante mi desarrollo de software encontré un par de casos que me permiten dudar sobre la gestión de la memoria. Tenía una biblioteca de terceros que me dio siempre punteros sin procesar de las funciones y en mi código los estaba transformando en std::shared_ptr (de std y no de boost. Por cierto, ¿cuál es la diferencia entre los dos?). Digamos que tengo el siguiente código:puntero sin formato C++ y std :: shared_ptr

ClassA* raw = new ClassA; 
std::shared_ptr<ClassA> shared(raw); 

Qué pasa cuando el puntero compartida sale del ámbito (digamos que fue declarado localmente en una función y ahora estoy saliendo de la función). ¿El objeto ClassA todavía existirá porque apunta un puntero sin formato ?

Respuesta

27

No, no lo hará. Al dar el puntero a shared_ptr le está dando a shared_ptr la responsabilidad de eliminarlo. Hará esto cuando el último objeto shared_ptr referido a él ya no exista. Los indicadores crudos no cuentan.

+1

Solo para dar una razón por la cual: shared_ptr no considera el puntero sin formato porque no hay manera de que shared_ptr lo sepa. Si piensa en cómo implementaría un shared_ptr usted mismo, verá que no puede detectar si hay indicadores crudos de los datos. – Wutz

+1

+1. Además, esta es la razón por la que debes 'nuevo' el objeto en la misma línea que creas el' shared_ptr'. Mejor aún, use ['make_shared'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –

+0

Gracias, de hecho, estoy de acuerdo en que no hay forma de saber si un puntero sin formato es apuntando al objeto. En este caso, es simplemente peligroso para el puntero sin formato, ya que apuntará a un objeto destruido porque el shared_ptr lo destruirá cuando esté fuera del alcance – ISTB

2

No, ClassA objeto será destruido. A menos que no haya copiado shared_ptr en algún lugar fuera del alcance, por lo que su contador de referencia es> 1.

5

no. El puntero compartido lo eliminará.

Si tiene una biblioteca de terceros que le proporciona un puntero, debe asegurarse de eliminarlo de la forma correcta. Si la lib de terceros lo asignó con 'malloc' por ejemplo, entonces necesita usar la implementación de 'free' que utiliza lib. Debe estar seguro de cómo se asignó.

¿La biblioteca ofrece una forma de destruir los objetos que le proporciona? En ese caso, debe usar esa función para destruirlo.

Cuestiones relacionadas