Dynamic Memory


Tip
Dynamic Memory is necessary when it is necessary to set some amount of memory in real time, or when the number of bytes is not known in advanced. However, the STL (list, vector, wstring, ...) can be used easily to manage dynamic memory.
Se usa la memoria dinámica cuando es necesario asignar en tiempo real una cantidad de memoria, o sea que no se conoce o no es posible calcular el número de bytes con anticipación. Sin embargo, la STL (list, vector, wstring, ...) permite manejar las memoria dinámica en forma muy sencilla (resize()).

Dynamic Memory

When an array is declared, its size must be defined in the code and the array cannot be resize later on. Pointers can be used to dynamically request and free memory.
Cuando un arreglo es declarado, su tamaño debe ser definido en el código y el arreglo no puede cambiar de tamaño más tarde. Los punteros pueden ser usados para dinámicamente solicitar y liberar memoria.

new and delete.

The instruction new is used to request memory as shown in the example below. The instruction returns NULL when there is not enough memory to complete the request. The instruction delete is always used with the instruction new to free the previously requested memory. The example below creates an array of five integer values.
La instrucción new es usada para solicitar memoria como se muestra en el ejemplo de abajo. La instrucción regresa NULL cuando no hay memoria suficiente para completar la solicitud. La instrucción delete es siempre usada con la instrucción new para liberar la memoria que se solicitó previamente. El ejemplo de abajo crea un arreglo de cinco valores enteros.

Program.h
void Program::Window_Open(Win::Event& e)
{
     int count = 5;
     int * weight = new int[count];

     weight [0] = 3;
     weight [1] = 7;
     weight [2] = 10;
     weight [3] = 1;
     weight [4] = -110;

     delete [] weight;
}


Tip
The main difference between dynamic memory and an array is that the array does not accept a variable to define the size of the array, while dynamic memory allows a variable to set the size of the variable.The Always call delete after a successful call to the instruction new.
La principal diferencia entre memoria dinámica y un arreglo es que cuando el arreglo no es posible usar variable para indicar el tamaño de este, mientras que la memoria dinámica si permite declara el tamaño usando variable. Siempre llame delete después de una llamada exitosa la instrucción new.

Tip
The code shown below illustrate how to verify if memory request using new completes successfully.
El código de abajo ilustra como verificar si la solicitud de memoria del comando new se completa exitosamente.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     int count = 5;
     int * weight = new int[count];

     if (weight != NULL)
     {
          weight [0] = 3;
          weight [1] = 7;
          weight [2] = 10;
          weight [3] = 1;
          weight [4] = -110;

          delete [] weight;
     }
}


Tip
When using dynamic memory, it is necessary to have a pointer to access this memory. Never move the position of the pointer without first freeing the requested memory using the delete command. The program below shows what you SHOULD NEVER do. In the example below, first memory is requested to store five integer values and later, memory is requested to store two integer values. Because delete is not called before setting the pointer to new memory address, there is no way to free the memory initially requested and this will produce a memory leak.
Cuando se usa memoria dinámica es necesario tener un puntero para accesar a esta memoria. Nunca mueva la posición del puntero sin antes liberar la memoria solicitada usando el comando delete. El programa de abajo muestra lo que usted NUNCA DEBE de hacer. En el ejemplo de abajo, primero se solicita memoria para almacenar cinco enteros y después se solicita memoria para almacenar dos enteros. Debido a que no se llama delete antes de apuntar el puntero a otra dirección de memoria, no existe forma de liberar la memoria inicialmente solicitada y esto producirá una fuga de memoria.

Program.h
void Program::Window_Open(Win::Event& e)
{
     int count = 5;
     int * weight = new int[count];

     weight [0] = 3;
     weight [1] = 7;
     weight [2] = 10;
     weight [3] = 1;
     weight [4] = -110;
     // A "delete" is missing here
     weight = new int[2]; // THIS WILL PRODUCE A MEMORY LEAK
     weight [0] = 60;
     weight [1] = -70;

     delete [] weight;
}


Tip
As the STL provides dynamic memory calling internally the instructions new and delete, use new and delete only when the performance is critical or when the STL is not appropriate for the application.
Como la STL proporciona memoria dinámica llamando internamente las instrucciones new y delete, use los comandos new y delete solamente cuando la velocidad del programa sea crítica o cuando la STL no sea apropiada para la aplicación.

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home