Muss eine Zeichenfolge, die mit ' strcpy erstellt wurde, freigegeben werden? Und wie kann man es befreien?
Bearbeiten: Das Ziel wird wie folgt zugewiesen:
%Vor% strcpy
selbst so keinen Speicher für den String Ziel zuweisen, nein, ist es nicht befreit werden müssen.
Natürlich, wenn etwas anders Speicher zugeordnet hatte, dann, ja, sollten diese Speicher schließlich befreit werden, aber das hat nichts mit strcpy
zu tun.
Die frühere Aussage scheint der Fall zu sein, da Ihre Definition ein Array von Zeichen Zeiger , anstatt eine Reihe von Zeichen:
%Vor%und das wird fast sicherlich mit:
gemacht werden %Vor%Es ist eine gute Idee, in Bezug auf die Verantwortung für Malloced Memory zu denken. Damit meine ich, dass die Weitergabe eines Malloc'ed-Speicherblocks auch die Verantwortung übernehmen kann, sie irgendwann freizugeben.
Sie müssen nur herausfinden (oder entscheiden, ob es Ihr Code ist), ob die Verantwortung für die Verwaltung des Speichers mit dem Speicher selbst einhergeht. Mit strcpy
, auch wenn Sie in einem bereits malloc'ed Block für das Ziel passieren, die Verantwortung ist nicht übergeben werden, so dass Sie immer noch selbst, dass Speicher frei haben. Auf diese Weise können Sie problemlos einen mallokalisierten oder nicht mallokalisierten Puffer übergeben, ohne sich darum kümmern zu müssen.
Sie können von denken strdup
das macht im Prinzip eine Kopie einer Zeichenkette, indem zuerst der Speicher dafür zugewiesen wird. Die zurückgegebene Zeichenfolge muss definitiv freigegeben werden.
Wenn Sie
verwenden %Vor%zum Beispiel, dann wird der Puffer freigegeben, wenn das Ende seines Bereichs erreicht ist.
Auf der anderen Seite,
%Vor%Auf diese Weise müssen Sie den zugewiesenen Speicher freigeben.
Aber es hat eigentlich nichts mit strcpy zu tun, sondern nur darum, wie Sie Ihre Zeichenfolge zuordnen.
Sie geben einen Zeiger auf den Zielpuffer für strcpy, es hängt also davon ab, wie Sie diesen Puffer zugewiesen haben, ob er freigegeben werden muss und wie er freigegeben werden soll.
Wenn Sie beispielsweise den Puffer mit malloc zugewiesen haben, müssen Sie ihn ja freigeben. Wenn Sie den Puffer auf dem Stack zugewiesen haben, dann wird dies nicht automatisch geschehen, wenn er den Gültigkeitsbereich verlässt.
Die Funktion strcpy
kopiert eine Zeichenfolge in einen Puffer, den Sie auf andere Weise erhalten müssen (z. B. malloc
); Sie sollten diesen Puffer freigeben, indem Sie den für Ihre Zuweisung richtigen Mechanismus verwenden.
strcpy()
erstellt keine Zeichenfolge, sondern kopiert nur eine Zeichenfolge. Die Speicherzuweisung ist vollständig von diesem Prozess getrennt.
Sie müssen also auf den Speicher achten, in den der String kopiert wird - wenn er dynamisch zugewiesen wurde, müssen Sie ihn irgendwann freigeben. Da Sie scheinbar einen Stack-reservierten Puffer haben, müssen Sie nichts Besonderes tun - der Puffer wird zurückgewonnen, wenn er den Gültigkeitsbereich verlässt.