Speicher freigeben ohne Einsicht in Funktion?



  • Ah, mir is einfach kein gescheiter Titel für die Frage eingefallen, sorry dafür.
    Also:
    Ich habe eine Funktion die als Outputparameter Pointer nimmt.
    Jetzt allokiere ich in der Funktion Speicher und lasse die Pointer darauf zeigen.
    Nun brauche ich die Pointer auch außerhalb, sind ja Outputparameter.
    Jetzt habe ich das Problem, ich muss die Dinger ja noch freigeben.
    Aber das verletzt ja das Prinzip der Funktionen, es sollte nicht nötig sein zu wissen, dass man diese Pointer noch freigeben muss.
    Wie kann ich das lösen?
    Die andere Möglichkeit die mir noch einfällt wäre eine Struktur zu erstellen und diese zurückzugeben. Aber nur für die Rückgabe eine Struktur zu erstellen empfinde ich irgendwie auch nicht als das Gelbe vom Ei.
    Nun ich denke aber, dass das kein seltener Fall ist und es dafür sicher schon ein standardset an Lösungen gibt. Was empfehlt ihr mir zu tun?



  • welche programmiersprache?



  • Lass den Benutzer den Speicher allokieren und schreib in das Ergebnis in den übergebenen Speicherbereich.

    Und eine Struktur zurückzugeben für sowas ist in der objektorientierten Programmierung normal, aber so wie du schreibst scheinst du eher in C zu programmieren.



  • Ja es ist C, aber nur für den Zweck^^ normalerweise hauptsächlich C# aber auch C++
    Ich wollte eigentlich auf eine Struktur verzichten, aber mir fällt kein anderer Weg ein...
    Das was du vorgeschlagen hast, geht nicht, weil es sich um ein Array handelt, dessen Größe erst in der Funktion klar wird.
    edit: wobei mir grad klar wird, dass ich mit Strukturen das Problem immer noch hätte, oder?



  • Ankou schrieb:

    Ja es ist C, aber nur für den Zweck^^ normalerweise hauptsächlich C# aber auch C++

    zu c# kann ich nichts sagen, in c++ würde man in so einem fall z.b. smartpointer benutzen, oder gleich einen standard-container.

    Ich wollte eigentlich auf eine Struktur verzichten, aber mir fällt kein anderer Weg ein...
    Das was du vorgeschlagen hast, geht nicht, weil es sich um ein Array handelt,
    dessen Größe erst in der Funktion klar wird.
    edit: wobei mir grad klar wird, dass ich mit Strukturen das Problem immer noch hätte, oder?

    wenn es nicht anders geht, führe die allokation in der funktion durch, aber vermeide es, dass der benutzer free() aufrufen muss. biete ihm statt dessen eine weitere funktion an, die das für ihn übernimmt.

    void* createFoo(void);
    void destroyFoo(void*);
    

    weise in der dokumentation darauf hin, dass er destroyFoo() aufrufen muss, wenn er die ressource nicht mehr benötigt.
    dadurch hast du den vorteil, dass es nach außen hin egal ist, was createFoo() und destroyFoo() machen. die details der implementation bleiben so in deiner hand und können später problemlos angepasst werden.



  • mhm, ok, das klingt nach nem Plan
    danke=)



  • orientiere dich doch an std. c funktionen wie strcpy(..) etc. diese bekomm ja aiuch nur einen zeiger für den Speicherberreich, und bei dennen muss auch gewährleistet sein das der zeige auf gültigen speicehr zeigt.. :xmas1: :xmas2:


Anmelden zum Antworten