malloc allokierter Speicher, uebergeben in c++



  • Hi,

    da ich mich auf dem Gebiet nicht besonders auskenne und ich die Antwort auch nicht recherchieren kann (zu speziell), hier meine Frage:

    Ich habe eine Funktion, die in C geschrieben ist, in eine DLL gepackt. In dieser Funktion wird Speicher mit malloc alloziert (allokiert?), der Pointer wird dann als return Wert an meine C++ Applikation zurueckgegeben.

    Funktioniert auch alles wunderbar (bis jetzt!), aber ich habe gelesen, dass ich einen mit malloc allokierten Speicherbereich nicht mit delete wieder freigeben darf! Mach ich aber 🙂

    Ist das unsaubere Programmierung und wie kann ich das verhindern (die DLL bleibt in C, kann nicht in C++ geaendert werden)?

    viele gruesse,
    bjoern



  • Morgen,

    warum gehst du nicht hin und stellst in der DLL nicht einfach eine Funktion zur
    Verfuegung, welche den Speicher wieder freigibt. Du koenntest den Speicher auch
    irgendwo abspeichern und dann den ganzen Speicher wieder freigeben, sobald die
    DLL entladen wird (falls das moeglich ist, ich kenne mich mit DLLs nicht so gut
    aus.

    Ansonsten wuerde ich fuer malloc reservierten Speicher doch besser free nutzen,
    um diesen wieder freizugeben.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Du koenntest den Speicher auch
    irgendwo abspeichern und dann den ganzen Speicher wieder freigeben, sobald die
    DLL entladen wird (falls das moeglich ist, ich kenne mich mit DLLs nicht so gut
    aus.

    Ist möglich, aber keine gute Idee - denn ne DLL kann ruhig auch mal ne Woche oder länger im Speicher bleiben... da wäre es doch Speicherverschwendung...



  • Shade Of Mine schrieb:

    virtuell Realisticer schrieb:

    Du koenntest den Speicher auch
    irgendwo abspeichern und dann den ganzen Speicher wieder freigeben, sobald die
    DLL entladen wird (falls das moeglich ist, ich kenne mich mit DLLs nicht so gut
    aus.

    Ist möglich, aber keine gute Idee - denn ne DLL kann ruhig auch mal ne Woche oder länger im Speicher bleiben... da wäre es doch Speicherverschwendung...

    Ok das stimmt. Bin nicht von so einem krassen Fall ausgegangen :). Dann doch
    lieber eine Funktion bereitstellen (in der DLL), welche dafuer zustaendig ist,
    einen Speicherbereich auch wieder freizugeben. Dann muss er sich nicht darum
    kuemmern, ob der Speicher mit malloc oder new reserviert worden ist, darum muss
    sich dann die Implementierung kuemmern.

    mfg
    v R



  • Es ist prinzipiell sauberer, zumindest unter c++, wenn das "ding" was den speicher allokiert, ihn auch wieder freigibt.

    funktionen die zeiger auf allokierten speicher, sei es zeichenkette oder anderes, zurueckgeben, und sich drauf verlassesn, das wer anderes die loescht = poese .

    Equivalent wuerd ich das mit der DLL sehen ....
    die sollte ihren spiecher selber loeschen koennen (ueber ne funktion), oder kombiniert, ueber funktion, oder wenn DLL runtergefahren wird ....

    prinzipiell, stell dir vor, du anederst mal deine DLL, und verwendest irgendwann mal c++ intern in der dll ... und aenderst deine allokierung von malloc auf new .....
    nun muessten alle deine dll anwender von free auf auf delete umstellen .... kennst du Die alle ?

    und noch was ...

    DLLs geben eigentlich recht selten "speicher" nach aussen ...
    Das macht in manchen Situationen probleme (z.b. wenn man ne eigene speicherverwaltung hat / verwenden soll , dann koennt man deine dll ned verwenden).
    Der sauberer weg ist meistens, den Client zu sagen wieviel speicher er denn braucht (meist verlangt die dll nen zeiger auf nen allokiertes array von einer strukt, die in der .h datei zur dll definiert ist) ... der client allokiert, uebergibt den zeiger an die dll, und die dll befuellt .... da ist wesentlich unproblematischer und flexiebler ....

    Ciao ....



  • Hi,

    danke, so mache ichs dann. Die DLL soll vorher sagen, wieviel Speicher sie braucht und der Client kümmert sich dann darum.

    bjoern


Anmelden zum Antworten