¿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?