Frage zur Speicherverwaltung



  • Hallo liebe Gemeinde,

    ich hätte zu folgendem Codeschnipsel mal eine Frage:

    int main(int argc, char* argv)
    {
        Objekt* Ptr;
        func(Ptr);
    
        // ...
    
        return 0;
    }
    
    void func(Objekt* P)
    {
        Objekt* Obj=new Objekt();
        P=Obj;
    }
    

    Nach meinem Verständnis müsste um ein Speicherleck zu vermeinden doch in die main-Funktion ein "delete Ptr"...

    Angenommen ich würde die Implementierung der Funktion func() nicht kennen (wie z.B. bei etlichen WinAPI Funktionen die auf diese Weise arbeiten), woher weiß ich nun das ich den Pointer deleten muss? Bzw. muss ich auf diese Art erhaltenen Speicher immer selbst freigeben? Oder muss ich Ptr in main() auf dem Stack erstellen und einen Zeiger darauf an func() übergeben?

    Sorry falls Fragen dieser Art hier schon mehrmals beantwortet wurden, aber mir sind keine erfolgbringenden Suchbegriffe zu dieser Thematik eingefallen.

    Gruß
    Matthias



  • Hallo

    wenn, dann muß es so aussehen :

    int main(int argc, char* argv)
    {
        Objekt* Ptr=func();
    
        // ...
        delete Ptr;
        return 0;
    }
    
    Objekt* func()
    {
        return(new Objekt());
    }
    

    Denn du bekommst die neue Speicheradresse in deiner Variante gar nicht zurück (wenn du nicht mit Pointer auf Pointer arbeiten willst)

    bis bald
    akari



  • ich glaube nicht dass man irgenweiner winapi funktion nen dummy pointer übergibt oder in sonst irgendeiner biblothek. Wenn die Biblothek selberirgendwelche objekte allocierte muss sie diese wieder freigeben

    Und auch wenn du delete Ptr in der main machst wird dir das nichts bringen weil der pointer irgendwo hinzeigt

    //edit: zu spät

    mfg



  • wenn dann so in der art

    CreateObject ( Obj** ppObj );
    DestroyObject ( Obj** ppObj );
    


  • Hallo,

    vielen Dank für die schnellen Antworten. Ich glaube ich hab da in meinem Kopf etwas mit Klassen und Strkturen durcheinander gebracht 🙂 - habe auf Funktionen angespielt welche einen Pointer auf Strukturen erwarten und diese dann füllen. Glaube da wa ich wohl ein wenig daneben gelegen...

    Danke und Gruß
    Matthias



  • _Matthias schrieb:

    ...

    Angenommen ich würde die Implementierung der Funktion func() nicht kennen (wie z.B. bei etlichen WinAPI Funktionen die auf diese Weise arbeiten), woher weiß ich nun das ich den Pointer deleten muss? Bzw. muss ich auf diese Art erhaltenen Speicher immer selbst freigeben? ....

    Allgemein gilt: wenn die Bibliothek vorsieht, dass DU das Freigeben der Resourcen uebernimmst, dann ist das auch 100%ig irgendwo in der Dokumentation vermerkt 🙂


Anmelden zum Antworten