Pergunta : Como I (re-) permite o alocamento de memória do montão dentro de uma função CWinThread-derivada da linha da classe invocada diretamente de InitInstance?

Esta pergunta morphed “pode você reproduzir em um problema do erro do sintoma”. - O primeiro comentário (de mim mesmo) tem abaixo um programa de amostra unido, assim que se alguém tem uma teoria a respeito do que pode ter acontecido, uma modificação rápida ao programa de amostra deve reproduzi-lo facilmente enough.

I criou uma função da linha do trabalhador envolvida por um objeto CWinThread-derivado. (chamado ThreadProcObject) - o

Within a rotina da linha (invocada diretamente de InitInstance - funcionar assim () e a bomba da mensagem não é ligada acima de) uma tentativa de alocar alguma memória do montão é feito (ver as rotinas Run1 do programa do exemplo () ou Run2 ()) e, quando o erro ocorre, o _malloc_debug () é invocado dentro da rotina nova do operador runtime () e retorna NULL.

pelo menos, este era o sintoma em meu programa do orignal, que eu tenho para reproduzir ainda no sample.

I pensei original que o que estava acontecendo é que entre o construtor o tempo do objeto CWinThread-derivado está invocado e para cronometrar a rotina da linha está chamado por InitInstance (nota, antes que Run1 () ou Run2 () está invocado, a linha vai dormir primeiramente esperando em uma “tarefa op apronta” o evento), e que alguma parte do (o montão?) as mudanças do contexto, assim eficazmente incapacitando a rotina nova e aquela do operador isto podiam ser resolvidas chamando algum Afx apropriado…? a rotina para restaurar o contexto do montão, mas isto parece ser examinação do wrong

An da chamada de InitInstance () a ThreadProc (), que WaitForMultipleObjects-delayed da rotina chama a Run1 () ou Run2 () e as chamadas do alocamento de memória em Run1 () ou o funcionamento (2) deve soar um sino se alguém tem todas as teorias a respeito de como o _malloc_dbg () poderia retornar NULO se a memória adequada exists.

I do montão concederá os pontos se alguém realmente pode reproduzir o problema (considera o comentário abaixo e seu programa unido) dentro do programa unido - e explicar como aconteceu no primeiro place.
class= do

Resposta : Como I (re-) permite o alocamento de memória do montão dentro de uma função CWinThread-derivada da linha da classe invocada diretamente de InitInstance?


Se o programa original está trabalhando bem, a seguir que é bom.  Você poderia deixar bom bastante sozinho, mas eu ainda penso que você deve mudar sua lógica da linha para estar mais orientado ao objecto como eu mencionei.  Assim, é duro pegarar como as coisas trabalham de olhar seu código: você tem UI misturado com a funcionalidade lower level.  Uma classe da linha modularizes tudo tanto melhor e fá-lo para uma leitura, daqui uma eliminação de erros mais fáceis se algo precisar de olhar em um outro dia.
Mas hey, é seu projeto…:)
>> você tem alguma idéia porque, quando é terminado estalando a tecla de “x”, o depurador de programas indica escapes de memória?
Eu ver o seguinte depois que eu ligo o depurador de programas, pressiono a tecla "Iniciar Cópias", a seguir próximo o app:

Escapes de memória detetados!
Despejando objetos - >
{542} bloco normal em 0x00DB16A0, 16 bytes por muito tempo.
 Dados: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD do DB 00
{541} bloco normal em 0x0003FBE8, 32 bytes por muito tempo.
 Dados: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} bloco normal em 0x00DB3FA0, 28 bytes por muito tempo.
 Dados: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Descarga do objeto completa.

Assim eu adiciono o seguinte a CWinThreadTestApp:: InitInstance ():

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

Agora em que o depurador de programas é ligado, eu começ imediatamente uma ruptura da eliminação de erros na linha:

OpRequestQ = (queue*)
    fila nova; // [MAX_CONCURRENT_POLLS+1];

Assim, adicionar

se supressão OpRequestQ (de OpRequestQ);

a seu destruidor:)  o _CrtSetBreakAlloc é realmente uma grande função para fazer o uso extensivo de quando necessária:)
Outras soluções  
 
programming4us programming4us