View Full Version : [C - C++]Allocazione dinamica della memoria, differenza
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:
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.
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 ;)
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
ah, ovviamente vale anche per calloc ;)
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 ;)
Oppure usi vector e ti sbatti altamente dell'allocazione...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.