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 ?
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. 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) –
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