Rückgabemethode und free()
-
Morgen Leute,
jetzt habe ich aber mal eine interessantere Frage
Ich habe eine Methode die mir einen BigInteger zurückliefert, also einfach:
BigInt blablabla (Argumente und so) BigInt s; //blaaa malloc(n*sizeof(unsigned long)): //mehr blaa return s }
Da ich aber keine Speicherlecks haben will, frage ich mich, wie kann ich den von s angeforderten Speicher den wieder frei geben? Nach dem return kann ja kein free(s) mehr kommen, davor auch nicht, da ich dann nicht mehr auf meine Daten zugreifen kann
Wie löst man das Problem in C?
-
Tja, vor kurzem gabs hier mal einen Link auf ein Buch, welches kostenlos im Internet bereitsteht und sich auch dieser Fragestellung widmet. Leider waren dort nicht alle Lösungen fehlerfrei.
Eine Variante wäre, dass der aufrufende Kontext den Speicherbereich für die zu ändernden Werte an die Funktion übergibt, also z.B.
int funktion(DeinTyp *var) { *var=irgendwas; return erfolgreichoderfehlercode; }
und dann "oberhalb":
DeinTyp var; int fehler=funktion(&var);
Hierbei kommst du ohne teures malloc/free aus und thread-safe ist die ganze Sache auch noch. Ansonsten müsstest du den in der Funktion mallokierten Speicher, d.h. den Zeiger darauf rückgeben, um ihn im aufrufenden Kontext freigeben zu können, wie du schon richtig erkannt hast:
DeinTyp *funktion(irgendwas) { DeinTyp *var=malloc(sizeof*var); *var=macheirgendwas; return var; }
und dann "oberhalb":
DeinTyp *tmpvar=funktion(...); *tmpvar macheirgendwas; free(tmpvar);
Wie gesagt ist dies ziemlich teuer, auch müsstest du dich um malloc/free-Fehlerbehandlung kümmern.
Verschiedene Leute empfehlen auch die Lösung mit lokalen statischen Bereichen, die brauchst du nicht malloc/free behandeln, sind aber nie thread-safe und dafür bekommst du hier von mir kein Beispiel, mach mal selbst.
-
Ich wusste es
Es geht hier um ein Projekt für die Uni und wir sollen/müssen den Umgang mit malloc/free erlernen und auch die "üblichen" Fehler vermeiden. Da ich aber nicht 1zu1 nach den Vorgaben arbeite (leider hatte ich schon andere Ideen im Kopf und dann lass ich mich ungerne davon abbringen
) hab ich nun das Problem.
Aber so gehts natürlich. Danke >:-]