Vraag : Hoe laat ik (aangaande) de toewijzing van het hoopgeheugen binnen toe een cWinThread-Afgeleide die functie van de klassendraad direct van InitInstance wordt aangehaald?

Deze vraag heeft morphed in een „kan probleem u van de symptoomfout“ reproduceren. - De eerste commentaar (van mij) heeft hieronder een steekproefprogramma in bijlage, zodat als iemand een theorie heeft in verband met wat kan gebeurd zijn die, zou een snelle wijziging aan het steekproefprogramma het moeten reproduceren gemakkelijk enough.

I heeft gecre�ërd een functie van de arbeidersdraad door een cWinThread-Afgeleid voorwerp wordt verpakt. (geroepen die ThreadProcObject) -

Within de draadroutine (direct van zo In werking gestelde InitInstance wordt aangehaald - () wordt en de berichtpomp wordt niet opgestart) een poging om één of ander hoopgeheugen toe te wijzen gemaakt (zie de routines van het voorbeeldprogramma Run1 () of Run2 ()) en, wanneer de fout voorkomt, _malloc_debug () aangehaald binnen de runtime exploitant nieuwe () routine en terugkeert NULL.

minstens, was dit het symptoom in mijn orignalprogramma, dat ik heb nog te reproduceren om in oorspronkelijk gedachte sample.

I dat is wat gebeurde dat binnen - tussen de tijd wordt de cWinThread-Afgeleide aannemer van de objecten aangehaald en de tijd wordt de draadroutine geroepen door InitInstance (nota, vóór Run1 () of Run2 () wordt aangehaald, gaat de draad wordt naar slaap eerste wachten op een „taakop klaar“ gebeurtenis), en dat één of ander deel van (hoop?) context veranderingen, waarbij effectief de exploitant nieuwe routine onbruikbaar wordt gemaakt en dat dit zou kunnen worden opgelost door één of andere aangewezen Afx te roepen…? de routine om de hoopcontext te herstellen, maar dit schijnen om wrong
An onderzoek/>
ayed van de routine waaraan Run1 () of Run2 roept () en de vraag van de geheugentoewijzing in Run1 () of de Looppas (2) zou een klok moeten bellen als iemand om het even welke theorieën heeft over hoe _malloc_dbg () ONGELDIG kon terugkeren als het adequate hoopgeheugen exists.

I de punten zal toekennen als iemand werkelijk het probleem (zie hieronder de commentaar en zijn programma in bijlage) kan reproduceren binnen het programma in bijlage - en verklaren hoe het in eerste place.
gebeurde

Antwoord : Hoe laat ik (aangaande) de toewijzing van het hoopgeheugen binnen toe een cWinThread-Afgeleide die functie van de klassendraad direct van InitInstance wordt aangehaald?


Als het oorspronkelijke programma goed werkt, dan is dat goed.  U kon goede genoeg alleen verlaten, maar ik denk nog dat u uw draadlogica zou moeten veranderen om meer voorwerp - te zijn georiënteerd zoals ik heb vermeld.  Aangezien het zich bevindt, is het moeilijk om op te nemen hoe de dingen van het bekijken uw code werken: u hebt UI met lagere niveaufunctionaliteit die wordt gemengd.  Een draadklasse modulariseert alles zo veel beter en maakt voor gemakkelijkere lezing, vandaar zuiverend als iets het bekijken zou moeten vergen een recentere datum.
Maar hey, is het uw project…:)
>> hebt u om het even welk idee waarom, wanneer het door de „x“ knoop wordt geëindigde te klikken, wijst debugger geheugen op lekken?
Ik zie het volgende nadat ik debugger, druk de starter begin, sluit dan app:

Ontdekte geheugenlekken!
Dumpende voorwerpen - >
{542} normaal blok bij 0x00DB16A0, 16 lange bytes.
 Gegevens: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD van OB 00 CD CD CD CD CD CD CD CD CD CD CD
{541} normaal blok bij 0x0003FBE8, 32 lange bytes.
 Gegevens: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 OB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} normaal blok bij 0x00DB3FA0, 28 lange bytes.
 Gegevens: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Volledige de stortplaats van objecten.

Zo voeg ik het volgende aan CWinThreadTestApp toe:: InitInstance ():

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

Nu wanneer debugger is begonnen, word ik onmiddellijk zuiver onderbreking op de lijn:

OpRequestQ = (queue*)
    nieuwe rij; // [MAX_CONCURRENT_POLLS+1];

zo, voeg toe

als (OpRequestQ) schrapping OpRequestQ;

aan uw vuilverbrandingsoven:)  _CrtSetBreakAlloc werkelijk is een grote functie om uitgebreid gebruik van wanneer noodzakelijk te maken:)
Andere oplossingen  
 
programming4us programming4us