realloc() unter c++
-
beschäftige mich grad mit dem c++ tutorial von volkard (<-erstmal großes lob an dich, ist echt genial!). Bei der Speicherreservierung unter c++ hab ich mich doch ein bisschen gewundert... Gibt es da keine Funktion, die Speicher an einen Speicherbereich anhängt? Sowas wie realloc() unter C? Weil ansonsten muss man ja immer mit new [] neuen Speicher reservieren, danach alles aus dem alten in den neuen kopieren und daraufhin wieder den alten zuerst "deleten", dann wieder reservieren, und schließlich den Inhalt des "buffers" wieder in den ursprünglichen Speicherbereich zurückkopieren, oder?
Also, sowas in der Art:template<class T> void growMem(T *array, int size,int newSize) { T *buffer=new T[newSize]; int i=0; while(i<size) { buffer[i]=array[i]; i++; } delete[] array; array=new T[newSize]; i=0; while(i<size) { array[i]=buffer[i]; i++; } delete[] buffer; }
Ein bisschen umständlich, oder??
Aber da gibts ja bestimmt wieder ne bessere und schnellere Möglichkeit, gell!
-
Nabend,
in C++ gibt es kein Pendant zur C-Funktion realloc. Brauchst du entsprechendes,
musst du es dir selbst schreiben. Oder du schaust, ob nicht eine der Container-
Klassen dir weiterhelfen kann.mfg
v R
-
Mein Code oben, würde aber insofern schon stimmen oder?
-
Ja, so koennte man es machen. Wobei ich zum kopieren std::memcpy einsetzen
wuerde.mfg
v R
-
aha, das hört sich doch gut an, wenigstens eine Funktion die mir einigermaßen aus der C-Zeit bekannt ist...
Danke erstmal...
-
MasterCounter schrieb:
Gibt es da keine Funktion, die Speicher an einen Speicherbereich anhängt? Sowas wie realloc() unter C?
was hindert dich daran realloc zu benutzen? geht doch.
-
Mich würd mal intressieren wieso du ausm Puffer wieder woanders hin kopierst...
mal dein alter code abgewandelt (also ohne memcpy):template<class T> T* growMem(T *array, int size,int newSize) // Gib den neuen Pointer zurück, sonst geht der Speicher verloren, ansonsten kannste auch ne referenz vom Pointer "array" übergeben { T *buffer=new T[newSize]; int i=0; while(i<size) { buffer[i]=array[i]; i++; } delete[] array; array=buffer; // ein zweites kopieren ist überflüssig return array; // Wie gesagt, zurück geben um damit zu arbeiten }
-
virtuell Realisticer schrieb:
Ja, so koennte man es machen. Wobei ich zum kopieren std::memcpy einsetzen wuerde.
möchtest du, daß ich zeige, warum du damit abstürze bauen kannst, oder willste es selber ausknobeln?
darfst kein memcpy verwenden, wenn du nicht weißt, was copy-ctor und dtor von T machen.
-
volkard schrieb:
virtuell Realisticer schrieb:
Ja, so koennte man es machen. Wobei ich zum kopieren std::memcpy einsetzen wuerde.
möchtest du, daß ich zeige, warum du damit abstürze bauen kannst, oder willste es selber ausknobeln?
darfst kein memcpy verwenden, wenn du nicht weißt, was copy-ctor und dtor von T machen.
Hab nicht drauf geachtet, dass es ne template-Funktion ist.
mfg
v R
-
net schrieb:
was hindert dich daran realloc zu benutzen? geht doch.
Aber nur, wenn du malloc und free benutzt. Ansonsten, realloc verträgt sich nicht mit new und delete.