Ist es möglich, den von C's alloca() zugewiesenen Speicher explizit freizugeben, bevor die aktuelle Funktion beendet wird? Wenn ja, wie?
Eine portable Implementierung ist "void freea(void *p) {} // Einfach vortäuschen".
Ist es möglich, den von C's alloca() zugewiesenen Speicher explizit freizugeben, bevor die aktuelle Funktion beendet wird? Wenn ja, wie?
Desde http://www.gnu.org/software/libc/manual/html_mono/libc.html#Variable-Size-Automatic :
Zuweisung eines Blocks mit
alloca
ist eine explizite Aktion; Sie können so viele Blöcke zuweisen, wie Sie wollen, und die Größe während der Laufzeit berechnen. Aber alle Blöcke werden freigegeben, wenn Sie die Funktion verlassen, von der aus alloca aufgerufen wurde, so als wären sie automatische Variablen, die in dieser Funktion deklariert wurden. Es gibt keine Möglichkeit, den Speicherplatz explizit freizugeben.
Es ist möglich, aber es gibt keine vorgefertigte Funktion, die dies ermöglicht. Sie müssen sich mit der Implementierung von alloca() in Ihrem Compiler auseinandersetzen, um herauszufinden, was sie tut, und dann Ihre eigene freea() schreiben. Da jeder Compiler alloca() anders implementiert, müssen Sie Ihr freea() für jeden Compiler neu schreiben.
Aber ich finde es schwer zu glauben, dass dies die Mühe wert wäre. Verwenden Sie einfach malloc/free, wenn Sie es explizit freigeben müssen - diese Funktionen sind normalerweise stark optimiert. Nutzen Sie sie aus.
Ähm, nein. Sie können den Stack-Zeiger nicht verschieben, ohne dass er beschädigt wird, und Sie können Elemente auf dem Stack nicht verschieben, weil ihre Adressen möglicherweise anderswo gespeichert sind. Der Grund, warum free/malloc funktionieren, ist, dass sie die volle Kontrolle über ihren Heap-Speicher haben.
Ich habe alloca() implementiert, und ja, Sie können ein freea() ausführen. Sie werden nicht mehr Elemente verschieben, als alloca() es tut - locals mit ihrer Adresse sind notwendigerweise vor dem alloca'd space. Sie sollten sowieso keine baumelnden Zeiger in den freigegebenen Speicherplatz zurücklassen, genauso wenig wie Sie das bei freigegebenem Speicherplatz tun können.
Mit C99 können Sie das Gleiche mit einer Array mit variabler Länge . Deklarieren Sie die VLA einfach in einem neuen Bereich; sie wird automatisch freigegeben, wenn der Bereich verlassen wird.
Zum Beispiel:
int some_function(int n) {
// n has the desired length of the array
...
{ // new scope
int arr[n]; // instead of int *arr = alloca(n*sizeof(int));
// do stuff with array
}
// function continues with arr deallocated
...
}
Mit alloca() allokieren Sie auf dem Stack; wenn danach etwas anderes passiert (und das können Sie nicht kontrollieren, ohne alles in Assembler zu schreiben), können Sie den Stack nicht einfach wieder verkleinern. Solange Sie also den Stack-Frame Ihrer Funktion nicht verlassen, ist dies unmöglich.
Das ist auch der Grund, warum Sie die Dinge durcheinander bringen können, wenn Sie den zugewiesenen Puffer überlaufen lassen. Sie können die Adressen des Codes, zu dem Ihre Funktion zurückkehrt, überschreiben, was dazu führt, dass sie an eine andere Stelle springt, und so weiter und so fort. Seien Sie vorsichtig!
Malloc arbeitet auf dem Heap und ist deshalb viel flexibler in seinen Möglichkeiten.
Dies wäre nützlich für den Continuation-Passing-Stil (CPS), eher ein Realloca.
Sie könnten eine Funktion aufrufen, die eine Zeichenkette oben auf dem Stapel zuweist und bearbeitet, bevor sie den Stapel wieder auf die Länge der Zeichenkette verkleinert und die nächste Funktion aufruft.
Es gibt keinen konzeptionellen Grund, warum es nicht eine freea() geben könnte, die für alles außer dem obersten Eintrag auf dem Stack ein nop wäre.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Können Sie Ihre Motivation erklären? Warum möchten Sie den zugewiesenen Platz vor der Rückkehr freigeben?