Kann ein CWinThread Memory Leaks verursachen?



  • Hallo allerseits

    Ich habe hier ein kleines Problem, das ich nun zwar fürs erste gelöst habe, aber ich verstehe nicht ganz, warum.

    Ich habe ein Thread, den ich wie folgt starte:

    CWinThread *pControlThread = AfxBeginThread(ControlThread, this);
    

    Beim beenden des Programms rufe ich

    TerminateThread(pControlThread,0);
    

    auf, um den Thread zu beenden.

    Trotzdem bekomme ich Memory Leaks. Ich habe dann mal einfach

    delete pControlThread;
    

    aufgerufen, und die Leaks waren verschwunden. 😮

    Kann mir jemand erklären, warum das so läuft? Ich benutze ja kein new um Speicher zu allozieren, folglich bräuchte ich kein delete. 😕

    Vielen Dank!



  • Manche Funktionen allocieren implizit mit new Speicher und geben den Zeiger auf das mit new neu erstellte Objekt zurück. Damit der Zeiger noch gültig ist, darf das Objekt natürlich nicht beim Verlassen der Funktion mit delete wieder freigegeben werden.
    D.h. Die Funktion allociert zwar mit new Speicher. Der Benutzer der Funktion ist dann aber selbst dafür verantwortlich diesen wieder mit delete freizugeben.

    Ist dies bei einer Funktion der Fall, ist (oder sollte) das dokumentiert sein.



  • Ich verstehe nicht ganz, was du mir damit sagen möchtest. Ich rufe ja nirgens new auf, sondern starte lediglich den Thread. Und wenn ich irgendwo new brauche, dann ist klar, dass ich mich selbst um meinen Müll zu kümmern habe. Die Frage ist vor allem, räumt TerminateThread den beendeten Thread nicht richtig auf oder was läuft hier denn falsch?



  • Ha, nun nach x-mal starten und beenden kam dann doch mal ein Fehler beim delete. Ok, also kann es das vielleicht doch nicht ganz sein. Aber kaum ist das delete weg, was sieht man? 🕶

    Detected memory leaks!
    Dumping objects ->
    thrdcore.cpp(311) : {621} client block at 0x0196AF60, subtype c0, 64 bytes long.
    a CWinThread object at $0196AF60, 64 bytes long


Anmelden zum Antworten