PDA

View Full Version : [C - C++]Allocazione dinamica della memoria, differenza


sirus
28-02-2005, 21:35
Ciao a tutti, guardando il mio nuova manuale di C++ ho visto il nuovo metodo di allocazione dinamica della memoria e mi è subito venuto un dubbio :(
prima in C facevo così:

#include <calloc.h>
...
double *p = NULL;
...
p = (double *) calloc(10, sizeof(double));
cfree(p);

ora invece in C++ farei così:

...
double *p = NULL;
...
p = new double[10];
...
delete p;

e se volessi variare la dimensione della memoria allocata dinamicamente???
prima facevo così:

p = realloc(p, _msize(p) + (5 * sizeof(double));

ma ora come posso fare??? :muro:

fek
28-02-2005, 23:59
Originariamente inviato da sirus
ma ora come posso fare??? :muro:

Non si fa' :D
O meglio, non si fa come in C, ma in maniera "piu' lenta", perche' in C++ hai a che fare con oggetti che non possono in generale essere copiati bit a bit. Per questo motivo non esiste alcun modo in C++ standard per reallocare la memoria "in place" come in C.

Finita la teoria, ora la pratica.



double* arrayOfDouble = new double[10];

...

// alloca un nuovo array
double* newArrayOfDouble = new double[20];

// copia il vecchio array in quello nuovo
for (unsigned int i = 0; i < 10; ++i)
{
newArrayOfDouble[i] = arrayOfDouble[i];
}

// cancella il vecchio array
delete[] arrayOfDouble;

// cambia nome al nuovo array
arrayOfDouble = newArrayOfDouble;


E' un po' piu' macchinoso e lento della versione equivalente C, ma e' sicuro che funzioni per ogni tipo di oggetto C++.
Se vuoi una versione piu' concisa puoi usare STL.

sirus
01-03-2005, 13:31
grazie per le info :) posso concludere che con il C++ la semplicità è aumentata ma la flessibilità è diminuita a fronte di un minor numero di errori ;)

71104
01-03-2005, 14:35
ci tengo a precisare che in C++ è ancora possibile utilizzare malloc realloc e free, quindi puoi utilizzare realloc solo se il blocco l'hai allocato con malloc, non con new; in teoria potresti anche con new, ma è meglio di no.
ciao

71104
01-03-2005, 14:36
ah, ovviamente vale anche per calloc ;)

sirus
01-03-2005, 15:06
Originariamente inviato da 71104
ci tengo a precisare che in C++ è ancora possibile utilizzare malloc realloc e free, quindi puoi utilizzare realloc solo se il blocco l'hai allocato con malloc, non con new; in teoria potresti anche con new, ma è meglio di no.
ciao
beh questa era ovvio ;)

cionci
01-03-2005, 16:44
Oppure usi vector e ti sbatti altamente dell'allocazione...