2010-11-17 12 views
2

Je travaille sur un projet MFC Visual C++. Comme je comprends de MSDN, _CrtDumpMemoryLeaks() devrait retourner TRUE quand il y a des fuites de mémoire._CrtDumpMemoryLeaks() == 1 sur la première ligne de code?

Après l'avoir remarqué est TRUE, j'ai essayé de trouver le premier point dans le code où il devient TRUE. Évidemment, c'est vrai dès le début. Si je clique F10 (étape-over) pour démarrer le débogage du programme, et entrer _CrtDumpMemoryLeaks() dans la fenêtre de la montre, il montre TRUE avant même la première ligne de code, dans le point d'entrée au programme:

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
           _In_ LPTSTR lpCmdLine, int nCmdShow) 
#pragma warning(suppress: 4985) 
{ 
    // call shared/exported WinMain 
    return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); 
} 

également , J'ai spéculé que peut-être les installations de débogage ne sont pas initialisées à ce point et que le TRUE est erroné. J'ai donc mis un point d'arrêt à la première ligne de la fonction OnInitDialog() et là aussi la valeur est TRUE.

Pourquoi ai-je des fuites de mémoire au début du programme?

Répondre

3

Vous interprétez mal la valeur de retour. TRUE ne signifie pas fuite de mémoire, cela signifie qu'il y a des blocs inédits dans le tas, qui pourraient tout aussi bien être pointés par certains pointeurs dans le programme. Ces objets peuvent être créés par le code de démarrage CRT et par les constructeurs d'objets statiques.

Si vous êtes toujours suspect - set an allocation hook et inspectez quand des objets sont créés. Pour ce faire assez tôt, vous aurez besoin d'un objet avec construit au démarrage - utilisez #pragma init_seg(compiler) pour cela.

1

Si vous avez des choses qui allouent de la mémoire pendant l'initialisation statique (ce qui arrive avant l'appel de winmain), elles apparaîtront comme des fuites de mémoire.

Vous pourriez essayer de placer un point d'arrêt sur HeapAlloc() - vous verrez probablement que cela sera atteint avant winmain.

2

C++ initialise les objets statiques avant d'appeler la méthode main() (ou WinMain si c'est le cas).

Avez-vous des objets statiques quelque part? Utilisez-vous Singleton pour initialiser un objet qui n'est jamais libéré? Utilisez-vous un cadre qui pourrait le faire derrière votre dos?

Questions connexes