Está en la página 1de 3

Funciones Que Manejan La Asignación Dinámica De Memoria.

En algunas situaciones de programación es imposible saber que tan grande puede necesitarse un arreglo, y no
es posible usar un arreglo predefinido ya que en ese caso las dimensiones quedan establecidas en tiempo de
compilación y no se pueden cambiar durante la ejecución.
La solución es crear arreglos dinámicos, ésta utiliza memoria de la región de memoria libre denominada (el
monton) heap, y es accedido indexando un puntero a esa memoria.
 
Operadores de manejo de memoria "new" y "delete", en C++

 El operador new sirve para reservar memoria dinámica.

DECLARACION DE PUNTERO, SINTAXIS. tipo_variable * Var_puntero;

CREACION DE LA MEMORIA DINAMICA.


UNA AREA DE MEMORIA, SIN INICIALIZAR AL PUNTERO
FORMA 1 tipo_variable * Var_puntero ; Var_puntero = new tipo_variable;

FORMA 2 tipo_variable * Var_puntero = new tipo_variable ;

UNA AREA DE MEMORIA, CON INICIALIZACIÓN DEL PUNTERO


FORMA 1 tipo_variable * Var_puntero ;
tipo_variable d=0;
cout<< “Indica el dato = ”; cin>>d;
Var_puntero = new tipo_variable( d ); // ver que se usan paréntesis

FORMA 2 tipo_variable d=0;


cout<< “Indica el dato = ”; cin>>d;
tipo_variable * Var_puntero = new tipo_variable( d ) ;

EJEMPLO SIMPLE
Var_puntero = new tipo_variable[tam_arreglo ]; // tam_arreglo indica el tamaño del arreglo
// no se puede inicializar un arreglo

La inicialización, si aparece, se usará para asignar valores iniciales a la memoria reservada con new, sin embargo
los arreglos no pueden ser inicializados.

Si la reserva de memoria no tuvo éxito, new devuelve un puntero nulo, NULL.

El operador delete se usa para liberar la memoria dinámica reservada con new.

Sintaxis: delete <var_puntero>;


delete [ tam_arreglo ]<var_puntero>; ó delete [ ] <var_puntero>;

La expresión será normalmente un puntero, el operador delete [ ] se usa para liberar memoria de arreglos
dinámicos.

Cuando se usa el operador delete con un puntero nulo, no se realiza ninguna acción. Esto permite usar el
operador delete con punteros sin necesidad de preguntar si es nulo antes.
Nota: los operadores new y delete son propios de C++.

Operadores new y delete con clases

Los operadores new y delete pueden ser aplicados tanto a variables de los tipos predefinidos ( int, float, double,
…) como a objetos de las clases definidas por el usuario. Su principal aplicación está en la creación de variables
con reserva dinámica de memoria, sustituyendo a las funciones calloc(), malloc() y free() que se utilizan en C.
Aquí es necesario hacer alguna matización referente a su uso con las clases definidas por el usuario.

Una vez creada la clase C_Cuenta, una sentencia del tipo:

UNA AREA DE MEMORIA, CON INICIALIZACIÓN DEL PUNTERO


FORMA 1 C_Cuenta * Obj_puntero ;
tipo_variable d=0; //tipo de dato que contiene el parámetro del constructor
cout<< “Indica el dato = ”; cin>>d;
Obj_puntero = new C_Cuenta ( d ); // ver que se usan paréntesis

FORMA 2 tipo_variable d=0;


cout<< “Indica el dato = ”; cin>>d;
C_Cuenta * Obj_puntero = new C_Cuenta ( d ) ;

supone una operación en tres fases:


1. En primer lugar se crea un puntero c1 capaz de contener la dirección de un objeto de la clase.
2. A continuación, por medio del operador new se reserva memoria para un objeto del tipo C_Cuenta.
3. Finalmente se llama, de modo transparente al usuario, a un constructor 1 de la clase C_Cuenta.

Los constructores son funciones que se llaman automáticamente al crear un objeto de una clase. Su misión es
dar un valor inicial a todas las variables miembro, de modo que no haya nunca objetos con variables sin un valor
apropiado (conteniendo basura informática).

El operador new se puede utilizar para crear vectores de objetos (en una forma similar a como se crean vectores
de variables) con reserva dinámica de memoria, en la forma:

C_Cuenta *ctas = new C_Cuenta[100]; // ver que se usan corchetes cuadrados

La diferencia fundamental entre new y delete, reservan y liberan zonas de memoria. Además hay que tener en
cuenta que new puede ser sobrecargado como cualquier otro operador, con las ventajas de simplificación de
código que ello supone.

Al utilizar delete, se libera la zona de memoria a la que apunta, pero sin borrar el propio puntero. Si se manda
liberar lo apuntado por un puntero nulo no pasa nada especial y el programa no libera memoria. Sin embargo si
se ordena liberar dos veces lo apuntado por un puntero las consecuencias son imprevisibles y puede que incluso
catastróficas, por lo que es importante evitar este tipo de errores.

En el caso de que se desee liberar la memoria ocupada por un vector creado mediante reserva dinámica de
memoria debe emplearse una instrucción del tipo: delete [ ] ctas; siendo ctas el puntero al primer elemento del
vector (el puntero que recogió el valor de retorno de new).

Parte de un ejemplo con herencia

También podría gustarte