Introducción a Patrones de Diseño en C++ con Qt4/1.16.2 Operadores new y delete

Versión para imprimir esta pagina

1.16.2. Operadores new y deleteEditar

C++ cuenta con un mecanismo que permite almacenar para ser alojado dinámicamente en tiempo de ejecución. Esto significa que el programador no necesita anticipar las necesidades de memoria de un programa en avance y hacer estimaciones del máximo monto de memoria que podría ser necesitada por el programa. La alocación dinámica de almacenamiento en tiempo de ejecución es una herramienta poderosa que ayuda a construir programas que sean eficientes y flexibles.


El operador new asigna almacenamiento desde el montón (también conocido como almacenamiento dinámico) y devuelve un puntero del objeto resultante. Si por alguna razón no le es posible a la memoria el asignarlo, una excepción es producida. (Sección 21.9)


Nota:
En general, el código que llama a 'new. debería documentarse, o estar físicamente asignada cerca del código que libera la memoria. La meta de esto es la de dejar el código de administración de memoria lo más simple y leíble posible.



El operador delete libera la memoria asignada dinámicamente y la regresa al montón. delete debiera ser aplicado a punteros devueltos por new, o para punteros nulos. La memoria del montón que no se necesitará más debiera ser liberada para su reuso. Olvidar esto puede resultar en deformes pérdidas de memoria.


Nota:
Qt, la Librería Estándar, y BOOST.org, cada uno proporciona una variedad de clases y funciones para ayudar a administrar y limpiar el montón de memoria. En adición a las clases de contenedor, cada librería tiene uno o más clases de punteros inteligentes. Un puntero inteligente es un objeto que almacena y administra un puntero a un objeto de montón. Esto funciona como un puntero ordinario, excepto que es borrado automáticamente el objeto del montón en el momento adecuado. Qt tiene a QPointer, la librería estándar tiene a std::auto_ptr, y BOOST cuenta con shared_ptr. Usar una de esas clases hace que el administrador de memoria de C++ sea mucho más simple y seguro de lo que en realidad es.



La sintaxis de los operadores new y delete es demostrada en el fragmento de código del Ejemplo 1.24.

Ejemplo 1.24Editar

Ejemplo: Ejemplo 1.24. src/pointers/newdelete/ndsyntax.cpp

int* ip = 0; puntero nulo

ip = new int; espacio asignado por un int

int* jp = new int(13); asignado e inicializado

delete ip; Sin esto, tenemos una pérdida de memoria.

{
int* ip = 0;
ip = new int;
int* jp = new int(13);
[...]      
delete ip;
delete jp;
}

Versión para imprimir esta pagina