3. Instancias en forma dinámica.


El operador new, se usa en estructuras y permite como ya vimos solicitar dinámicamente en tiempo de ejecución un espacio en memoria.

Como dijimos anteriormente una estructura es como un tipo de datos.. es por eso que la sintaxis sería :



struct registro {int x; float y; bool a; float fecha[3]}; //Defino la estructura.
struct registro *p; //Declaro puntero a la plantilla de datos llamada registro.
int n; //cantidad de instancias.
cin>>n;
p=new struct registro[n]; // Solicito n instancias dinámicamente, ubicadas de manera contígua en memoria

Hasta el momento no habías mencionado la posibilidad de que ante la solicitud de memoria el sistema pueda no tener esa memoria solicitada como disponible.  En el caso de que no exista ese espacio solicitado  new  regresa un puntero  nulo ( si se usa nothrow) o  lanza una excepción bad_alloc.

Las excepciones son situaciones anómalas que requieren un tratamiento especial no pensar que es necesariamente un error.
El funcionamiento general del mecanismo de lanzamiento y tratamiento de excepciones es el siguiente:    Existe un método que invoca la ejecución de otro.

Nothrow constante

Este valor constante se usa como argumento para el operador nuevo y el operador nuevo [] para indicar que estas funciones no lanzarán una excepción en caso de falla, sino que devolverán un puntero nulo.

De forma predeterminada, cuando se usa el nuevo operador para intentar asignar memoria y la función de manejo no puede hacerlo, se lanza una excepción bad_alloc. Pero cuando nothrow se usa como argumento para new, devuelve un puntero nulo en su lugar.

Esto podemos usar para verificar si no existe espacio en memoria  y dar tratamiento a este caso especial.



//Ejemplo de nothrow
#include <iostream>    
using namespace std;
int main () 
{
cout << "Intentando solicitar un mega... ";
char* p = new (nothrow) char [1048576];//Pido 1Mega de datos tipo char.
if (!p)
{ // Puedo preguntar si el puntero es null (por que usé nothrow)
cout << "Falla!\n"; //Quiere decir que NO hay espacio
   }
else
{ //Si NO es nulo.. hay espacio!!
cout << "Existoso!\n";
>    delete[] p;
}
return 0;
}

Es probable que en los ejercicios que realicemos no siempre tengamos en cuenta o verifiquemos esto.. de todas maneras la idea es que se sepa el inconveniente que puede suceder.