Frage : Wie ermöglichen I (re-) HaufenSpeicherallozierung innerhalb einer CWinThread-abgeleiteten Kategoriengewindefunktion, die direkt von InitInstance hervorgerufen wird?

Diese Frage hat in ein „kann Sie Problem reproduzieren der Symptomstörung“ verwandelt. - Die erste Anmerkung (von mich) hat unten ein angebrachtes Programmbeispiel, also, wenn jemand eine Theorie hat hinsichtlich, was geschehen sein kann, sollte eine schnelle Änderung am Programmbeispiel es reproduzieren leicht enough.

I haben verursacht eine Arbeitskraftgewindefunktion, die durch einen CWinThread-abgeleiteten Gegenstand eingewickelt wird. (benannt ThreadProcObject) -

Within das Gewindeprogramm (hervorgerufen direkt von InitInstance - so laufen () und die Mitteilungpumpe werden nicht gestartet), ein Versuch, irgendein Haufengedächtnis zuzuteilen wird gebildet (Beispielprogrammprogramme Run1 sehen () oder Run2 ()) und, wenn die Störung auftritt, wird _malloc_debug () innerhalb des neuen () Programms des Laufzeitoperators hervorgerufen und NULL.

mindestens zurückbringt, war dieses das Symptom in meinem orignal Programm, das ich, im angebrachten sample.

I schon zu reproduzieren dachte ursprünglich habe, dass, was ist geschah, dass zwischen der Zeit der CWinThread-abgeleiteten Erbauer des Gegenstandes hervorgerufen wird und Zeit Gewindeprogramms festzusetzen von InitInstance (Anmerkung, bevor Run1 () oder Run2 () hervorgerufen wird, das Gewinde geht zu schlafen zuerst, wartend auf eine „OPaufgabe, vorbereiten“ Ereignis) benannt wird und dass irgendein Teil von (Haufen?) Zusammenhangänderungen, das neue Programm und das des Operators so effektiv sperrend dieses konnten gelöst werden, indem man irgendein passendes Afx… benannte? das Programm, zum des Haufenzusammenhangs wieder herzustellen, aber dieses scheint, wrong

An Prüfung des InitInstance () Anrufs zu ThreadProc zu sein (), das WaitForMultipleObjects-delayed des Programms zu Run1 () benennt, oder Run2 () und die Speicherallozierung benennt in Run1 () oder Durchlauf (2) sollte eine Glocke schellen, wenn jemand irgendwelche Theorien hat hinsichtlich, wie _malloc_dbg () UNGÜLTIGES zurückbringen, wenn ausreichendes Haufengedächtnis exists.

I die Punkte zuspricht, wenn jemand das Problem wirklich reproduzieren kann (sehen die Anmerkung unten und sein angebrachtes Programm) innerhalb des angebrachten Programms - und erklären könnte, wie es im ersten place.
geschah

Antwort : Wie ermöglichen I (re-) HaufenSpeicherallozierung innerhalb einer CWinThread-abgeleiteten Kategoriengewindefunktion, die direkt von InitInstance hervorgerufen wird?


Wenn das ursprüngliche Programm gut funktioniert, dann, das gut ist.  Sie konnten gutes genug allein lassen, aber ich denke noch, dass Sie Ihre Gewindelogik ändern sollten, um objektorientierter zu sein, wie ich erwähnt habe.  Unter den gegebenen Umständen aufzuheben ist hart, wie Sachen vom Betrachten Ihres Codes arbeiten: Sie haben UI gemischt mit auf der unteren Ebenefunktionalität.  Eine Gewindekategorie modularisiert alles soviel besser und bildet für einfacheren Messwert, folglich Entstörung, wenn etwas zu einem späteren Zeitpunkt betrachten muss.
Aber he, ist es Ihr Projekt…:)
>> haben Sie irgendeine Idee, warum, wenn er beendet wird, indem man den „x-“ Knopf anklickt, der Debugger Gedächtnislecks anzeigt?
Ich sehe das folgende, nachdem ich den Debugger anstelle, betätige den Startknopf, dann nah die APP:

Ermittelte Gedächtnislecks!
Dumping Gegenstände - >
{542} normaler Block an 0x00DB16A0, 16 Bytes lang.
 Daten: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD DB-00
{541} normaler Block an 0x0003FBE8, 32 Bytes lang.
 Daten: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} normaler Block an 0x00DB3FA0, 28 Bytes lang.
 Daten: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Gegenstanddump komplett.

So füge ich das folgende CWinThreadTestApp: hinzu: InitInstance ():

 _CrtSetBreakAlloc (542);
 _CrtSetBreakAlloc (541);
 _CrtSetBreakAlloc (526);

Jetzt, als der Debugger angestellt wird, erhalte ich sofort einen ausprüfenbruch auf der Linie:

OpRequestQ = (queue*)
    neue Warteschlange; // [MAX_CONCURRENT_POLLS+1];

so hinzufügen

wenn (OpRequestQ) Löschung OpRequestQ;

zu Ihrem Verbrennungsofen:)  _CrtSetBreakAlloc ist wirklich eine große Funktion, zum des umfangreichen Gebrauches von erforderlichenfalls zu bilden:)
Weitere Lösungen  
 
programming4us programming4us