Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/05/2014, 02:19
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Arreglos, vectores y matrices

@shikamarucb: la forma que crees que no se puede usar se llama array de longitud variable, y es aceptada desde C99:

Código C++:
Ver original
  1. int a;
  2. cin >> a;
  3. int vec[a];

El sistema intentará reservarte a*sizeof(int) bytes al momento y la liberará al finalizar el ambito de la variable. El punto en contra de este metodo es que no tienes ninguna forma de saber si el sistema pudo reservar la memoria solicitada, y el problema lo tienes cuando sin haber conseguido reservar memoria intentas trabajar con la variable y provocas un desbordamiento de pila.

Código C++:
Ver original
  1. int a;
  2. cin >> a;
  3. int vec[a];//no puedes comprovar la reserva
  4. vec[0] = 1;//si hubo un error en la reserva de memoria aqui petará la aplicacion

A causa de esto se recomienda usar el new para reservar memoria; en c++ tambien puedes usar malloc para reservar memoria para no-objetos (variables estandar).

Retormando el ejemplo que te puso @vangodp implemento la comprovacion de error en la reserva de memoria:

Código C++:
Ver original
  1. //con try-catch
  2. try {
  3.     tabla = new int * [n];
  4. }
  5. catch (bad_alloc &e) {
  6.     //error
  7. }
  8.  
  9. //con nothrow
  10. if(!(tabla = new (nothrow) int * [n])) {
  11.     //error
  12. }

La comprovacion de reserva tienes que hacerla para cada new, igual que al finalizar tienes que llamar a un delete para cada new.

Saludos
vosk