free() nach return()?



  • Hallo!

    Eventuell könnt ihr mir bei meinem Problem helfen. Ich habe eine Funktion geschrieben, die einen Rückgabewert zurückgeben soll. Den Speicher für diese habe ich dynamisch reserviert. Doch müss ich und wie soll ich den Speicher wieder freigeben, wenn ich den Wert der Variable doch zurückgeben will? Ich möchte kein Speicherleck produzieren... Sieht in etwa so aus:

    char func(char parameter);
    {
    	char *rueckgabe;
    	[...]
    	free(rueckgabe);
    	return *rueckgabe;
    }
    

    Wie kann ich free() so benutzen, dass ich rueckgabe trotzdem zurückgeben kann?

    MfG
    Danke



  • Du gibts da aber nur einen char zurück und keinen Zeiger.
    Wenn du das Array zurückgeben möchtest, muss eben der Benutzer der Funktion den Speicher freigeben.



  • Soll die Funktionen also so lauten?

    char func(char &parameter)
    {
    [...]
    }
    
    int main()
    {
    	char *uebergabe;
    	func(&uebergabe);
    	[...]
    	free(uebergabe);
    }
    


  • Entweder

    void func(char** parameter);
    // oder
    char* func2();
    

    Wenn du char* übergeben würdest, dann würde die Zeigeradresse kopiert werden. Daher muss die Referenz des Zeigers übergeben werden.
    Das Zerstören muss der Aufrufer der Funktion dann durchführen.



  • Mach es in jedem Fall so, dass der, der die Funktion aufruft, sowohl Speicher anfordert als auch freigibt. In der Funktion allozieren und sich dann darauf verlassen, dass eine Ebene höher auch immer ans Freigeben gedacht wird, verleitet zu Fehlern und ist nicht schön.



  • _matze schrieb:

    Mach es in jedem Fall so, dass der, der die Funktion aufruft, sowohl Speicher anfordert als auch freigibt. In der Funktion allozieren und sich dann darauf verlassen, dass eine Ebene höher auch immer ans Freigeben gedacht wird, verleitet zu Fehlern und ist nicht schön.

    Das ist grundsätzlich richtig, da aber viele Bibiotheksfunktionen (COM etc.) so aufgebaut sind, ist es nicht verkehrt, sich einmal damit zu beschäftigen.



  • Vicious Falcon schrieb:

    _matze schrieb:

    Mach es in jedem Fall so, dass der, der die Funktion aufruft, sowohl Speicher anfordert als auch freigibt. In der Funktion allozieren und sich dann darauf verlassen, dass eine Ebene höher auch immer ans Freigeben gedacht wird, verleitet zu Fehlern und ist nicht schön.

    Das ist grundsätzlich richtig, da aber viele Bibiotheksfunktionen (COM etc.) so aufgebaut sind, ist es aber nicht verkehrt, sich einmal damit zu beschäftigen.

    Akzeptiert, solange erklärt wird, was die beste Variante (meine natürlich! 😃 ) ist. :p

    @Danke: Wo wir schon mal dabei sind... Vicious Falcon hat ja schon die Variante mit Zeiger auf Zeiger gezeigt (toller Satz 😉 ). Damit kannst du solche tollen Sachen machen, die dann schon in Richtung Objektorientierung gehen:

    CreateMyObject(objType **obj) {
      *objType=malloc(x*sizeof(objType);
      //...
    }
    
    DeleteMyObject(objType **obj) {
      //...
      free(*objType);
    }
    

    Die Variante bietet sich an, wenn die "zu allozierende Sache" wirklich als eine Art Objekt (oder Handle) gesehen werden kann und du damit zwischen Allokation und Zerstörung noch einiges anstellen willst (DoSomethingWithMyObject-Funktion). Außerdem wird auch hier auf einer Ebene Speicher alloziert und freigegeben (wer Create... aufruft, muss auch Delete... aufrufen), wie es sich gehört. 😉



  • Ich werd mal eure Vorschläge ausprobieren. Viele Dank!



  • Einen Zeiger darfst du nicht dereferenzieren, nachdem Du den entsprechenden Speicherblock freigegeben hast. Vorher darfst Du aber.

    char func(char parameter);
    {
    	char *rueckgabe;
    	[...]
    	char retVal = *rueckgabe;  // erst dereferenzieren
    	free(rueckgabe);           // dann freigeben
    	return retVal;
    }
    

    mfg Martin


Anmelden zum Antworten