Todo libro, tutorial o curso, cubre de sobra el aspecto de reserva dinámica de memoria. Es una de las características principales del lenguaje C++ y la que le da la categoría de lenguaje de bajo nivel. Si bien es cierto que se explica la sintaxis para usarla, en los recursos que he utilizado a lo largo de los años nunca he encontrado nada que hable no sólo del cómo sino del cuando es correcto el uso de memoria dinámica.
Es cierto que con la experiencia uno va viendo a base de prueba-error cuando es útil realmente usar este tipo de reserva de memoria, y también es cierto que si el recurso con el que aprendiste el lenguaje es medianamente bueno, te harás una buena idea de cuando tiene sentido utilizar reserva dinámica de memoria y cuando no. En cualquier caso, aquí está mi opinión.
Podemos considerar que una de las propiedades que nos ayudarán a decidir cuando usar reserva dinámica o no, es la duración de almacenamiento de la variable en cuestión. Pongamos que tenemos una clase predefinida, y queremos obtener una instancia de la misma. Tenemos dos maneras de obtener dicha instancia:
MyClass obj; MyClass *obj = new MyClass;
En la primera de ellas, el objeto obj se crea con una duración de almacenamiento que viene fijada por el propio compilador, es decir existirá hasta que se destruya, lo que ocurrirá cuando nos salgamos del scope donde este objeto ha sido declarado.
En cambio cuando instanciamos un objeto como en el segundo caso, el objeto tiene reserva dinámica de memoria lo que significa que existirá hasta que nosotros decidamos cuando con la palabra reservada delete. De aquí podemos deducir una norma no escrita en piedra que podremos utilizar para mantenernos cuerdos a la hora de utilizar variables, utiliza siempre que puedas la reserva automática de memoria.
Hay muchas situaciones en las que sin embargo necesitamos utilizar reserva dinámica de memoria:
- Cuando trabajamos con variables que se encuentran fuera de nuestro scope y queremos acceder a ellas. En este caso en el que no queremos una copia, sino los valores originales ya que es posible que queramos cambiarlos, utilizaremos reserva dinámica de memoria.
- Uno de los motivos principales es la necesidad de reservar una cantidad de memoria considerable que puede que llene la pila de memoria. Esto no debería ocurrir a no ser que estemos trabajando con sistemas un tanto diferentes y hay que tenerlo en cuenta.
En cualquier caso, a partir del estandar C++11 es aconsejable utilizar punteros inteligentes, std::unique_ptr, std::shared_ptr ya que ellos mismos manejan cuando se destruyen en función de cuando dejan de usarse haciendo que la memoria se maneje de una forma negligente. Mi opinión siempre es, plantear el puntero normal y cuando se liberará memoria (new y delete) y luego considerar si en algún momento uno de los punteros inteligentes puede aportar algo más.
REFERENCIAS