Question : Comment I (re-) permettent-ils l'attribution de mémoire de tas dans une fonction CWinThread-dérivée de fil de classe appelée directement d'InitInstance ?

Cette question morphed dans « peut vous un problème reproduire de symptôme erreur ». - Le premier commentaire (de me) a ci-dessous un programme d'échantillon joint, ainsi si quelqu'un a une théorie quant à ce qui peut s'être produit, une modification rapide au programme d'échantillon devrait le reproduire facilement enough.

I ont créé une fonction de fil d'ouvrier enveloppée par un objet CWinThread-dérivé. (appelé ThreadProcObject) - le

Within la routine de fil (appelée directement d'InitInstance - courir ainsi () et la pompe de message ne sont pas démarrées vers le haut de) une tentative d'assigner une certaine mémoire de tas est fait (voir les routines Run1 de programme d'exemple () ou Run2 ()) et, quand l'erreur se produit, le _malloc_debug () est appelé dans la nouvelle () routine d'opérateur d'exécution et renvoie NULL.

au moins, c'était le symptôme dans mon programme d'orignal, que j'ai se reproduire encore dans le sample.

I ai à l'origine pensé que ce qui se produisait est qu'entre le temps le constructeur de l'objet CWinThread-dérivé est appelé et chronométrer la routine de fil s'appelle par InitInstance (note, avant que Run1 () ou Run2 () est appelé, le fil va dormir d'abord attendant sur une « tâche op préparent » l'événement), et qu'une certaine partie de (le tas ?) des changements de contexte, de ce fait effectivement désactivant la nouvelle routine et cela d'opérateur ceci ont pu être résolus en appelant un certain Afx approprié… ? la routine pour reconstituer le contexte de tas, mais ceci semble être examen du wrong

An de l'appel d'InitInstance () à ThreadProc (), que WaitForMultipleObjects-delayed de la routine appelle à Run1 () ou Run2 () et l'attribution de mémoire appelle dans Run1 () ou course (2) devrait sonner une cloche si quelqu'un a n'importe quelles théories quant à la façon dont le _malloc_dbg () pourrait renvoyer NUL si à mémoire proportionnée exists.

I de tas attribuera les points si quelqu'un réellement peut reproduire le problème (voient le commentaire ci-dessous et son programme joint) dans le cadre du programme joint - et expliquer comment il s'est produit dans le premier place.
class= de

Réponse : Comment I (re-) permettent-ils l'attribution de mémoire de tas dans une fonction CWinThread-dérivée de fil de classe appelée directement d'InitInstance ?


Si le programme original fonctionne bien, alors qui est bon.  Vous pourriez laisser assez bon seul, mais je pense toujours que vous devriez changer votre logique de fil pour être plus orienté objectivement comme j'ai mentionné.  Sans modification, il est difficile de reprendre comment les choses fonctionnent de regarder votre code : vous avez UI mélangé à la fonctionnalité plus basse.  Une classe de fil modularise tout tellement mieux et conduit à une lecture, par conséquent à une élimination des imperfections plus faciles si quelque chose a besoin regarder à une date ultérieure.
Mais hé, c'est votre projet… :)
>> avez-vous une idée pourquoi, quand il est terminé en cliquant le bouton de « x », le programme de mise au point indique des fuites de mémoire ?
Je vois le suivant après que je mette en marche le programme de mise au point, presse le bouton marche, puis étroit le $$etAPP :

Fuites de mémoire détectées !
Vidant des objets - >
{542} bloc normal à 0x00DB16A0, 16 bytes long.
 Données : <>bsp ;  &nbsp ; &nbsp  &nbsp ; &nbsp ; > A8 15 CD CD CD CD CD CD CD CD CD CD CD CD du DB 00
{541} bloc normal à 0x0003FBE8, 32 bytes long.
 Données : <>bsp ;  &nbsp ; &nbsp  &nbsp ; &nbsp ; > A0 16 DB 00 00 00 00 00 00 00 00 00 00 00 00 00
{526} bloc normal à 0x00DB3FA0, 28 bytes long.
 Données : <>bsp ;  &nbsp ; &nbsp  &nbsp ; &nbsp ; > 00 00 00 00 CD CD CD CD CD CD CD CD E8 FB 03 00
Décharge d'objet complète.

Ainsi j'ajoute le suivant à CWinThreadTestApp : : InitInstance () :

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

Maintenant où le programme de mise au point est démarré, j'obtiens immédiatement une coupure de correction sur la ligne :

OpRequestQ = (queue*)
    nouvelle file d'attente ; // [MAX_CONCURRENT_POLLS+1] ;

ainsi, ajouter

si suppression OpRequestQ (d'OpRequestQ) ;

à votre destructeur :)  le _CrtSetBreakAlloc est vraiment une grande fonction pour faire l'utilisation étendue de si nécessaire :)
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us