¿Qué son los smart pointers y cuándo deberían usarse?
¡Hola, colegas! No llevo mucho tiempo programando en C++, pero ya me he encontrado con el problema de las fugas de memoria. Por ahora uso raw pointers normales con `new` y `delete`, pero constantemente olvido llamar a `delete`, especialmente cuando el código se llena de excepciones y retornos tempranos. Por ejemplo:
```cpp
void process() {
Resource* res = new Resource();
// ... algún código que puede lanzar una excepción ...
delete res; // si hubo una excepción, no llegamos aquí — ¡fuga!
}
```
He oído hablar de los smart pointers en C++11, pero no termino de entender qué son. En internet hay mucha información, pero me gustaría una explicación clara: ¿qué son estos bichos?, ¿en qué se diferencian de los punteros normales?, y ¿en qué situaciones realmente deberían usarse? Me interesan especialmente `std::unique_ptr`, `std::shared_ptr` y `std::weak_ptr`. ¿Cuándo elegir cada uno? ¿Hay trampas ocultas? Agradecería ejemplos de código y explicaciones para principiantes.