realloc vs free/malloc

Gast #1000079
Lesenswert?

Realloc versucht, den bestehenden Speicherblock nach hinten zu
vergrößern. Nur wenn dies nicht möglich ist, wird ein neuer
Speicherblock gemalloct, die Daten dort hinein kopiert und der alte
gefreet.
Gast #1000456
Lesenswert?

Jo. Bei Reallob besteht die immerhin Chance, einfach das Blockende ein 
Stück nach hinten zu verschieben und so den Block größer zu machen. 
Wenns nicht hinhaut, wird automatisch free+malloc gemacht.
Gast #1002685
Lesenswert?

Das ganze soll für eine schnelle container Klasse benutzt werden.

Im Moment benutze ich beim ändern Kapazität der Liste malloc um neuen 
Speicher anzufordern, und kopiere dann mit
1
new (adress) T(old_v[i])
die Objekte in den neuen Speicherbereich (T is der Templateparameter. es 
wird also der Copy-Construktor verwendet). Anschließend wird der alte 
mit free gelöscht.

C++ Objekte sollte man ja nicht bitweise mit z. B. memcpy verschieben, 
sondern ebend den Copy-Construktor verwenden. Dieses kopieren versuche 
ich nun zu vermeiden, soweit dies möglich ist.

Gibt es vielleicht eine Möglichkeit, einen Speicherbereich nur zu 
vergrößern, wenn dies ohne verschieben möglich ist?

Könnte ich mich zumindest beim verkleinern mittels realloc darauf 
verlassen, dass der Speicherbereich nicht verschoben wird?
Gast #1004951
Lesenswert?

Klaus wrote:
> Ich verdopple immer den Speicher, wenn die Kapazität nicht reicht.

Das ist auch nicht gerade die beste Strategie und fuehrt gerade bei 
Systemen, die viel Spreicher brauchen, schnell in den Abgrund...
Gast #1007483
Lesenswert?

> Könnte ich mich zumindest beim verkleinern mittels realloc
> darauf verlassen, dass der Speicherbereich nicht
> verschoben wird?

Nein. Da für die Funktionen der C-Standardbibliothek nur definiert wird, 
WAS sie tun, aber nicht, WIE sie es tun, gibt es darauf keinen Verlass.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren