[C con Clase] Realloc en C++ con 'new' y 'delete'

Salvador Pozo salvador en conclase.net
Vie Nov 19 12:42:36 CET 2010


El pasado 2010-11-19 10:20:25, memmaker650 escribió:
 
m> Tengo este código que algunos ya conocerán. Lo que quiero saber es si hay un realloc o posibilidad de reservar más memoria pero sin perder los datos que ya tengas guardado, lo cual no sucede en mi programa. A ver si alguno puede ayudarme, un saludo.

Hola:

En C++ no existe un equivalente a "realloc". La forma de conseguir ese efecto es:
1) Crear un nuevo array dinámico del tamaño deseado (ya sea mayor o menor)
2) Copiar los elementos del array original al nuevo (todos si el nuevo es mayor, o los que quepan si es menor).
3) Eliminar la memoria asignada al array original
4) Asignar la dirección del nuevo array al antiguo.

De este modo el nuevo array contendrá la información del antiguo y conservaremos las referencias sin pérdidas de memoria.

En tu ejemplo hay varias cosas que es necesario cambiar.

Para empezar, necesitamos saber el tamaño del array en cada momento, para saber cuantos elementos tenemos que copiar del viejo al nuevo. Este valor también tendremos que pasarlo al "metodo".

Hay muchas formas de hacer esto:
  - Variable global (mala opción).
  - Usar algún truco, como almacenar en el elemento 0 el número de elementos (opción aceptable, pero que invalida la regla de que el primer elemento sea el de índice 0).
  - Encapsular el vector en una clase. (opción obvia cuando se trabaja con un lenguaje orientado a objetos).

Usando la primera opción, tu "método" podría quedar así:

int* metodo(int* vector, int *nelementos)
{
   int N=6;
   int *nVector;

   nVector = new int[N];
   for(int i = 0; i < min(nelementos,N); i++)
      nVector[i] = vector[i];
   delete[] *vector;
   vector = nVector;
   nElementos = N;

   for(int i=1; i<N; i++)
   {
   *vector[i]=i+5;
   }
   printf("Valores del vector: %d, %d, %d, %d y %d \n",
           vector[0],vector[1],vector[2],vector[3],vector[4]);
   return vector;
}

(Eso si no he cometido errores, no he compilado esta función).

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase