Avatar ·

¿Qué es un smart pointer y cuándo debería usarlo?

¡Hola a todos! Recientemente comencé a estudiar C++ y constantemente me encuentro con problemas al trabajar con memoria. Especialmente me asustan las fugas de memoria y los punteros colgantes. Por ejemplo, a menudo escribo código así: ```cpp class MyClass { public: int* data; MyClass() { data = new int(42); } ~MyClass() { delete data; } }; void example() { MyClass* obj = new MyClass(); // ... algún código que puede lanzar una excepción delete obj; } ``` El problema es que si ocurre una excepción entre `new` y `delete`, o si olvido llamar a `delete`, la memoria se fuga. Y si alguien elimina el objeto antes de tiempo y yo sigo usándolo, el programa se cuelga. He oído que en C++11 aparecieron los «smart pointers», que deberían resolver estos problemas. Pero no entiendo cómo funcionan ni cuándo aplicarlos. ¿Cuál es la diferencia entre `unique_ptr`, `shared_ptr` y `weak_ptr`? ¿Debería siquiera usar punteros normales ahora? ¿Y cómo se deben usar correctamente?