Frei allokierten Speicher vor der Rückgabe einer Funktion
Ich versuche, ein array zurückgeben, mit malloc in einer Funktion:
char* queueBulkDequeue(queueADT queue, unsigned int size)
{
unsigned int i;
char* pElements=(char*)malloc(size * sizeof(char));
for (i=0; i<size; i++)
{
*(pElements+i) = queueDequeue(queue);
}
return pElements;
}
Das problem ist, dass ich zu frei es, weil mein MCU-heap-Größe ist begrenzt. Aber ich möchte es zurückgeben, damit ich mich nicht befreien kann es in der Funktion, richtig?. Kann ich kostenlos den Speicher außerhalb der Funktion liegt (wo ich die Funktion aufrufen). Gibt es irgendwelche best practices? Vielen Dank im Voraus!
Sie haben, um frei außerhalb der Funktion. Es gibt keine Anforderung, dass malloc Speicher würde müssen freigegeben werden, die innerhalb der Funktion sowieso.
Natürlich. Dies ist der ganze Punkt von
Natürlich. Dies ist der ganze Punkt von
malloc
. Wenn Sie könnten das nicht tun, hätte es keinen Grund für malloc
jemals erstellt wurden.InformationsquelleAutor KiL | 2012-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als den Speicher von malloc() auf dem heap und nicht auf dem stack, können Sie darauf zugreifen, unabhängig davon, in welcher Funktion sind Sie in. Wenn Sie übergeben möchten, etwa "malloc ()" ed-Speicher, Sie haben buchstäblich keine andere Wahl, als zu befreien es von dem Anrufer. (im "reference counting" Bedingungen, das ist, was wird als Eigentum übertragen.)
InformationsquelleAutor
1) ja, Sie können kostenlos() malloc ' ed Speicher außerhalb der Funktion
2) Nein, nicht befreien kann es in der Funktion und habe die Daten weitergegeben, die außerhalb der Funktion, so müssen Sie 1) hier
3) Wenn Sie sich Gedanken über den knappen Speicher, den Sie brauchen, um zu überprüfen, die für den Misserfolg von Speicherzuordnungen immer, was du nicht zu tun hier, das wird dann wahrscheinlich dazu führen, dass ein segfault
ja, ich Sorge über dieses Problem, wenn Sie kostenlos ein malloc würde den Speicher außerhalb der Funktion. Wie kann man es beheben?
der "fix" ist, um den Fall behandeln, wo Sie Ihre memory-allocation-Routinen sind nicht in der Lage, den Speicherbedarf, die Sie wollen, und richtig scheitern, anstelle von was auch immer thread-of-control ist die Ausführung immer b0rkened durch einen NULL-Zeiger.
InformationsquelleAutor tbert
Natürlich können Sie das gratis-Speicher in einer Funktion außerhalb der Funktion, sofern Sie es zurück.
Aber, eine alternative wäre die ändern Ihre Funktion, wie unten, wo der Anrufer nur reserviert & gibt den Speicher. Diese wird inline mit dem Konzept der Funktion, die den Speicher reserviert übernimmt die Verantwortung für die Speicherfreigabe.
//In der Anrufer
InformationsquelleAutor Jay
Ja, Sie können freien Speicher in einer Funktion, die Sie rufen außerhalb der Funktion; dies ist genau das, was Sie tun müssen, in diesem Fall.
Alternativen sind vorbei ein Puffer und dessen Länge an die Funktion und Rückgabe der tatsächlichen Länge der Anrufer, der Weg
fgets
tut. Dies ist vielleicht nicht die beste alternative, weil die Anrufer nennen müsste, Ihre Funktion in einer Schleife.InformationsquelleAutor dasblinkenlight