free () - Funktion ohne malloc oder calloc
kurze Frage
Können mit der free () - Funktion ohne vorherigen Aufruf ein malloc ??
ei.
void someFunc( void )
{
char str[6] = {"Hello"};
//some processing here ....
free(str);
}
Bekomme ich kein kompilieren Fehler, aber funktioniert das oder stimmt es überhaupt ?
Danke,
- Tatsächlich können Sie
free
ohne Aufrufmalloc
, aber nur, wenn der Wert, den Sie passieren, umfree
ist ein null-Zeiger. Also nicht nützlich, wenn das, was Sie wollen, ist ein pointer, die können zu einem zugewiesenen block, aber vielleicht auf einem lokalen array.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht bei allen richtig:
char str[6]
.str
zugewiesen werden, auf dem stack und wird automatisch freigegeben, wenn die Funktion zurückgibt. @paxdiablo, ja, Aufruf von free() mit 0 oder NULL oder ein Zeiger NULL ist, ist das kein problem.Beim Aufruf malloc() oder eine beliebige andere Zuordnung Funktion, Speicher zugeteilt werden, auf die heap. Dies ist der einzige Speicher, der freigegeben werden kann. Wenn Sie deklarieren eine statische Zeichenfolge, wie du getan hast in deinem Beispiel wird der string zugewiesen, werden bei der Kompilierung in einen anderen Speicher-segment. Das gleiche gilt für die
str
Zeiger selbst ist aufgeteilt auf das stack, und somit nicht freigegeben werden kann, entweder.Benutzung frei auf einem nicht-malloc würd variable ergibt einen Segfault in der Regel. Beispiel:
$ gcc-test.c -o test
$ ./test
Segmentation fault
free() verwendet die Daten vorangestellt, um den zugewiesenen block zu verwalten heap. Wenn der Speicher darauf hingewiesen, der nicht reserviert wurde, die von einem heap-allocation-Funktion wie malloc() oder calloc(), dann die Daten vor der block wird bedeutungslos, wie heap-management-Daten.
Einige Bibliotheken erkennt ungültige Haufen Daten und yieled zu einem Laufzeitfehler, da sonst das Verhalten undefiniert ist. Oft sind die Folgen solcher Fehler unbemerkt bleiben, bis Sie später versuchen zu reservieren, weitere Speicher. Dies kann das Debuggen solcher Fehler sehr schwer.
Die Sie nicht bekommen würde ein compiler-Fehler, da es nicht ein syntaktischer Fehler und ist nicht nachweisbar, die zur compile-Zeit. Der compiler hat keine Kenntnis über die Semantik von library-Funktionen. Er weiß, dass malloc() gibt einen void* und dass frei() akzeptiert ein void*; es gibt keine Möglichkeit zu wissen, zur compile-Zeit, ob verweist der Zeiger auf einen dynamisch zugewiesenen block, weil der Speicher ist per definition zur Laufzeit allokierten. Auch die Zeiger können zur Laufzeit geändert werden, um Punkt-zu-Speicher-Typ, oder vielleicht Aliasing - zu einem anderen kopiert Zeiger und dann frei würde, durch den zweiten Zeiger. Sie erwarten viel von dem compiler, wenn Sie erwarten, eine Fehlermeldung; jedoch einige statische Analyse-tools können in der Lage sein zu warnen, wenn ein solcher Fehler kann auftreten, und eine dynamische Analyse-tools wie valgrind kann den Fehler erkennt, Wann und ob es tatsächlich Auftritt während der Prüfung.
Keine
Den
free(3)
- Funktion nimmt einenvoid *
parameter, so können Sie geben es irgendeine Art von Zeiger ohne eine compile-time-Fehler. Aber schlechte Dinge passieren wird, wenn der Zeiger war ursprünglich nicht zurückgegebenmalloc(3)
und nie zuvor zurück gegebenfree(3)
.