Questione : Come la I (re-) permette alla ripartizione di memoria del mucchio all'interno di una funzione CWinThread-derivata del filetto del codice categoria invocata direttamente da InitInstance?

Questo problema morphed “può voi riprodurre in un problema di errore di sintomo„. - Il primo commento (da me) sotto ha un programma di campione allegato, in modo da se qualcuno ha una teoria quanto a che cosa può accadere, una modifica rapida al programma di campione dovrebbe riprodurrla facilmente enough.

I ha generato una funzione del filetto dell'operaio spostata da un oggetto CWinThread-derivato. (denominato ThreadProcObject) - il

Within la procedura del filetto (invocata direttamente da InitInstance - così funzionare () e la pompa del messaggio non è avviata su) un tentativo di assegnare una certa memoria del mucchio è fatto (vedere le procedure Run1 di programma di esempio () o Run2 ()) e, quando l'errore accade, il _malloc_debug () è invocato all'interno di nuova () procedura dell'operatore runtime e restituisce NULL.

almeno, questo era il sintomo nel mio programma di orignal, che ho ancora riprodurrmi nel sample.

I originale ho pensato che che cosa stava accadendo è che fra il costruttore il tempo dell'oggetto CWinThread-derivato fosse invocato e cronometrare la procedura del filetto è denominato da InitInstance (nota, prima che Run1 () o Run2 () è invocato, il filetto andasse dormire in primo luogo attendendo “su un'operazione op ready„ l'evento) e che una certa parte del (mucchio?) i cambiamenti di contesto, così efficace rendendo invalido la nuova procedura e quella dell'operatore questo hanno potuto essere risolti denominando un certo Afx adatto…? la procedura per ristabilire il contesto del mucchio, ma questo sembra essere esame del wrong

An della chiamata di InitInstance () a ThreadProc (), che WaitForMultipleObjects-delayed della procedura denomina a Run1 () o Run2 () e la ripartizione di memoria denomina in Run1 () o funzionamento (2) dovrebbe squillare una campana se qualcuno ha qualunque teorie quanto a come il _malloc_dbg () potrebbe restituire NULLO se la memoria sufficiente exists.

I del mucchio assegni i punti se qualcuno realmente può riprodurre il problema (vede il commento qui sotto ed il relativo programma allegato) nell'ambito del programma allegato - e spiegare come è accaduto nel primo place.
class= del

Risposta : Come la I (re-) permette alla ripartizione di memoria del mucchio all'interno di una funzione CWinThread-derivata del filetto del codice categoria invocata direttamente da InitInstance?


Se il programma originale stia funzionando bene, quindi che è buono.  Potreste lasciare solo abbastanza buon, ma ancora penso che dovreste cambiare la vostra logica del filetto per essere più orientato oggettivamente come ho accennato.  Così com'è, è duro da prendere come le cose funzionano dall'esame del vostro codice: avete UI misto con funzionalità a livello più basso.  Un codice categoria del filetto modularizza più meglio tutto così tanto e porta a lettura, quindi a ricerca degli errori più facili se qualcosa deve esaminare una data ulteriore.
Ma hey, è il vostro progetto…:)
>> avete di idea perché, quando è terminato scattando il tasto “di x„, il programma di messa a punto indica le perdite di memoria?
Vedo quanto segue dopo che avvio il programma di messa a punto, premo il pulsante di avvio, quindi vicino il app:

Perdite di memoria rilevate!
Facendo uscire gli oggetti - >
{542} blocco normale a 0x00DB16A0, 16 byte di lunghezza.
 Dati: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD di DB 00
{541} blocco normale a 0x0003FBE8, 32 byte di lunghezza.
 Dati: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} blocco normale a 0x00DB3FA0, 28 byte di lunghezza.
 Dati: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Deposito dell'oggetto completo.

Così aggiungo quanto segue a CWinThreadTestApp:: InitInstance ():

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

Ora in cui il programma di messa a punto è avviato, immediatamente ottengo una rottura di eliminazione degli errori sulla linea:

OpRequestQ = (queue*)
    nuova coda; // [MAX_CONCURRENT_POLLS+1];

così, aggiungere

se cancellazione OpRequestQ (di OpRequestQ);

al vostro distruttore:)  il _CrtSetBreakAlloc realmente è una grande funzione per fare il vasto uso di se necessario:)
Altre soluzioni  
 
programming4us programming4us