Cuestión : ¿Cómo I (re-) permite la asignación de memoria del montón dentro de una función CWinThread-derivada del hilo de rosca de la clase invocada directo de InitInstance?

Esta pregunta morphed en “puede usted reproducir un problema del error del síntoma”. - El primer comentario (de me) abajo tiene un programa de muestra atado, así que si alguien tiene una teoría en cuanto a qué puede haber sucedido, una modificación rápida al programa de muestra debe reproducirlo enough.

I ha creado fácilmente una función del hilo de rosca del trabajador envuelta por un objeto CWinThread-derivado. (llamado ThreadProcObject) - se hace el

Within la rutina del hilo de rosca (invocada directo de InitInstance - así funcionar () y la bomba del mensaje no se enciende encima de) una tentativa de asignar una cierta memoria del montón (véase las rutinas Run1 del programa del ejemplo () o Run2 ()) y, cuando ocurre el error, el _malloc_debug () se invoca dentro de la nueva () rutina del operador runtime y vuelve NULL.

por lo menos, éste era el síntoma en mi programa del orignal, que tengo todavía reproducirse en el sample.

I pensé original que qué sucedía es que entre el constructor el tiempo del objeto CWinThread-derivado está invocado y medir el tiempo de la rutina del hilo de rosca es llamado por InitInstance (nota, antes de que Run1 () o Run2 () está invocado, el hilo de rosca va a dormir primero esperando en una “tarea de Op. Sys. alista” acontecimiento), y que una cierta parte de (el montón?) ¿los cambios del contexto, así con eficacia inhabilitando la nueva rutina y ésa del operador esto podían ser resueltos llamando algún Afx apropiado…? la rutina para restaurar el contexto del montón, solamente esto aparece ser examinación del wrong

An de la llamada de InitInstance () a ThreadProc (), que WaitForMultipleObjects-delayed de la rutina llama a Run1 () o Run2 () y la asignación de memoria llama en Run1 () o funcionamiento (2) debe sonar una campana si alguien tiene cualesquiera teorías en cuanto a cómo el _malloc_dbg () podría volver NULO si la memoria adecuada exists.

I del montón concede los puntos si alguien puede reproducir realmente el problema (véase el comentario abajo y su programa atado) dentro del programa atado - y explicar cómo sucedió en el primer place.
class= del

Respuesta : ¿Cómo I (re-) permite la asignación de memoria del montón dentro de una función CWinThread-derivada del hilo de rosca de la clase invocada directo de InitInstance?


Si el programa original está trabajando bien, después que es bueno.  Usted podría dejar bastante buen solo, pero todavía pienso que usted debe cambiar su lógica del hilo de rosca para estar más orientado al objeto como he mencionado.  Tal y como están las cosas, es duro coger cómo las cosas trabajan de mirar su código: usted tiene UI mezclado con la funcionalidad de nivel inferior.  Una clase del hilo de rosca modulariza todo tanto mejor y lo hace para una lectura, por lo tanto un depuración más fáciles si algo necesita mirar más adelante.
Pero hey, es su proyecto…:)
>> ¿usted tiene idea porqué, cuando es terminada chascando el botón de “x”, la depuración indica escapes de memoria?
Veo el siguiente después de que encienda la depuración, presiono la tecla de partida, después cercano el app:

¡Escapes de memoria detectados!
Descargando objetos - >
{542} bloque normal en 0x00DB16A0, 16 octetos de largo.
 Datos: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD del DB 00
{541} bloque normal en 0x0003FBE8, 32 octetos de largo.
 Datos: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} bloque normal en 0x00DB3FA0, 28 octetos de largo.
 Datos: <>bsp;  &nbsp; &nbsp &nbsp; &nbsp; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Descarga del objeto completa.

Agrego tan el siguiente a CWinThreadTestApp:: InitInstance ():

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

Ahora en que se enciende la depuración, consigo inmediatamente una rotura de la eliminación de errores en la línea:

OpRequestQ = (queue*)
    nueva coleta; // [MAX_CONCURRENT_POLLS+1];

Así pues, agregar

si cancelación OpRequestQ (de OpRequestQ);

a su destructor:)  el _CrtSetBreakAlloc es realmente una gran función para hacer uso extenso de cuando es necesaria:)
Otras soluciones  
 
programming4us programming4us