Fråga : Hur (re-) I möjliggör högminnestilldelning inom CWinThread-härledd klassificerar tråden fungerar åkallat direkt från InitInstance?

Detta ifrågasätter har morphed in i ”kan dig ett problem reproducera för symptomfelet”. - Den första nedanföra kommentaren (från jag själv) har ett fäst ta provprogram, så, om någon har en teori om vad kan ha händt, har en snabb ändring till ta provprogramet bör reproducera det lätt enough.

I skapat en arbetare som tråden fungerar slåget in av CWinThread-härledd anmärker. (se exempelprogramrutiner Run1 () (kallat ThreadProcObject) -

Within den rutinmässiga tråden (åkallat direkt från InitInstance - således körningen () och meddelandet pumpar inte startas upp), ett försök att tilldela något högminne göras eller Run2 ()) och när felet uppstår, _malloc_debug () åkallas inom det nya () rutinmässigt för runtime operatör och går NULL.

tillbaka åtminstone, detta var tecknet i mitt orignalprogram, som jag har ännu att reproducera i den fäste sample.
I tänkte ursprungligen att vad händde är det in - mellan tiden som dethärledde objektets constructor åkallas, och att tajma den rutinmässiga tråden kallas av InitInstance (notera, för Run1 () eller Run2 () åkallas, tråden går att sova först att vänta på en op ”uppgift ordnar till” händelse), och att någon del av (högen?) sammanhangändringar, således inaktivera effektivt rutinmässigt och det för operatör det nya detta kunde lösas, genom att kalla något, anslår Afx…? rutinmässigt till återställandet högsammanhanget, men detta verkar att vara undersökning för wrong

An av den InitInstance () appellen till ThreadProc (), som rutinens WaitForMultipleObjects-delayed appeller till Run1 () eller Run2 () och appellerna för minnestilldelning i Run1 () eller körning (2) bör ringa en sätta en klocka på, om någon har några teorier om, hur _malloc_dbg () kunde gå OGILTIGT tillbaka, om adekvat den ska utmärkelsen för högminnet exists.

I pekar, om någon faktiskt kan reproducera problemet (ser den nedanföra kommentaren och dess fäste program) inom det fäste programet - och förklara hur det händde i den första place.
" klar "

Svar : Hur (re-) I möjliggör högminnestilldelning inom CWinThread-härledd klassificerar tråden fungerar åkallat direkt från InitInstance?


Om det original- programet är den funktionsdugliga brunnen, då som är bra.  Du kunde lämna goda nog ensam, men den stilla funderare för I, att du bör ändra din trådlogik för att vara mer anmärker - orienterat, som jag har nämnt.  Som den står, det är hårt att välja upp hur saker fungerar från att se din kodifierar: du har UI som är blandad med lägre jämn funktionsduglighet.  En tråd klassificerar modularizes allt som så mycket är bättre och, gör för lättare läsning, hence feltestning, om något bör behöver att se på ett mer sistnämnd, daterar.
Men hey, den är din projekterar…:),
>> du har någon idé varför, när den avslutas genom att klicka ”xet” knäppas, avlusaren indikerar att minnet läcker?
Jag ser efter, efter jag har startat avlusaren, press startknappen, därefter tätt appen:

Det avkända minnet läcker!
Att dumpa anmärker - >
{542} det normalakvarter på 0x00DB16A0, 16 byte long.
 Data: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD för DB 00
{541} det normalakvarter på 0x0003FBE8, 32 byte long.
 Data: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} det normalakvarter på 0x00DB3FA0, 28 byte long.
 Data: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Anmärka dumpar färdigt.

Så jag tillfogar efter till CWinThreadTestApp:: InitInstance ():

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

, då nu avlusaren startas, jag får omgående ett feltestningsavbrott på fodra:

OpRequestQ = (queue*)
    nytt köa; // [MAX_CONCURRENT_POLLS+1];

tillfoga, så

om (OpRequestQ) borttagnings OpRequestQ;

till din destructor:)  _CrtSetBreakAlloc är egentligen en store fungerar för att göra omfattande bruk av, när det är nödvändigt:)
Andra lösningar  
 
programming4us programming4us