Werden Zeiger rekursiv freigegeben?
-
Wieder mal Hallo,
hatte bezüglich meines letzten Threads noch eine bestimmte Frage, die ich aber in diesem Thread auslagern möchte. Folgender Beispielcode:
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> typedef struct Buffer { int size; unsigned char *buf; } Buffer_t; int main () { const char Text[] = "Ich bin irgendein Inhalt"; // Testweise Befüllen einer Struktur (als Zeiger) Buffer_t *alterBuffer = (Buffer_t*)calloc(1, sizeof(*alterBuffer)); if (!alterBuffer) return -1; alterBuffer->buf = (unsigned char*)calloc(1, sizeof(Text)); if (alterBuffer->buf) { memcpy(alterBuffer->buf, Text, sizeof(Text)); alterBuffer->size = sizeof(Text); } // neue Struktur erstellen (kein Zeiger) und 'alterBuffer'-Struktur kopieren Buffer_t neuerBuffer; neuerBuffer = *alterBuffer; // 'Buffer' freigeben if (alterBuffer) free(alterBuffer); // Gefahr für 'neuerBuffer->buf' ? return 0; }
Ich habe eine Struktur (als Zeiger), die ich gerne kopieren möchte. Die Zielstruktur ist in diesem Fall kein Zeiger. Innerhalb der Struktur befindet sich ein Basisdatentyp (int) und ein Zeiger (unsigned char *buf). Wenn ich diese Struktur nun über: 'neuerBuffer = *alterBuffer;' kopiere, so greift 'neuerBuffer->buf' auf die gleiche Adresse wie 'alterBuffer->buf' zu. Das ist erstmal so ok, da eine 1:1 kopie in eine andere Adresse nicht zwangsläufig nötig ist.
Meine Frage: kann sich 'free(alterBuffer)' irgendwie auf 'neuerBuffer->buf' auswirken? ...also bleibt der Zeiger ('neuerBuffer->buf') gültig, solange nicht vorher auch 'free(alterBuffer->buf)' aufgerufen wurde?
Habe ich hier eventuell irgendwelche schwerwiegenden Fehler drin, die sich ggf. nicht sofort bemerkbar machen? ...oder wäre es hier gleich sinnvoll auch mit new/delete zu arbeiten?
...und äh... würde ich eine komplette Kopie der Struktur haben wollen, müsste ich dann jeden enthaltenen Zeiger (bzw. worauf dieser zeigt) mit memcpy() kopieren oder geht es auch am Stück. Also die Struktur mit allen Inhalten + den dynamischer Speicher auf den die Zeiger zeigen.
viele Grüße,
SBond
-
Dieser Thread wurde von Moderator/in nachtfeuer aus dem Forum Rund um die Programmierung in das Forum C (alle ISO-Standards) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Zu jedem
alloc
gehört einfree
.
(einrealloc
macht ggf. einfree
)Wenn du auch neuen Speicher für die Zeiger haben möchtest, musst du die Kopierfunktion selber schreiben.
Du solltest aber auf deine Typen achten.
char
ist für Zeichen (und als Array oder Zeiger für C-Strings).
unsigned char
undsigned char
sind zum Rechnen.
-
neuerBuffer.buf bleibt gültig.
Es ist schlechtes Design, denselben Zeigerwert an unterschiedlichen Stellen vorzuhalten.
-
ja das kann ich gut nachvollziehen. Wäre eine echte Kopie eine bessere Lösung, wenn die Strukturen + der dynamische Speicher kleiner sind als ...sagen wir mal 500 Bytes?
@Dirk: hast recht :). War hier nur so eine quick'n'dirty Lösung für das Beispiel. Bei meiner späteren Anwendung wird es ein ASN1-Datenstrom sein.
nochmals danke für die Informationen
Ihr habt mich schon sehr geholfen