Utiliser VS pour détecter les fuites de mémoire

Remarque : il ne peut être utilisé qu'en mode débogage de VS

Comment utiliser:

Faites apparaître ces lignes en haut de tous les fichiers .cpp.
La méthode est la suivante :
S'il n'y a qu'un seul fichier cpp, placez-le simplement en haut
S'il y a plusieurs fichiers cpp, écrivez un fichier d'en-tête, écrivez-le en haut du fichier d'en-tête, puis laissez tous les fichiers cpp inclure ce fichier d'en-tête

#define _CRTDBG_MAP_ALLOC   //必须放在#include<crtdbg.h>之前
#include <crtdbg.h>
#include <stdlib.h>
#define NEW_WITH_MEMORY_LEAR_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
#define new NEW_WITH_MEMORY_LEAR_CHECKING

Puis ajouter avant le retour 0 de la fonction principale

_CrtDumpMemoryLeaks();

Lors d'une exécution comme celle-ci, les informations de fuite de mémoire (longueur de l'objet, la valeur des premiers octets) seront sorties de la fenêtre de sortie !

exemple:

#define _CRTDBG_MAP_ALLOC   //必须放在#include<crtdbg.h>之前
#include <crtdbg.h>
#include <stdlib.h>
#define NEW_WITH_MEMORY_LEAR_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
#define new NEW_WITH_MEMORY_LEAR_CHECKING

int main(int argc, char* argv) {
    
    
    auto p = new int[10];
    //delete[] p;   //申请了内存但没有释放
    
	_CrtDumpMemoryLeaks();
	return 0;
}

Sortie :
insérez la description de l'image ici
on peut voir que le programme ci-dessus perd 40 octets de mémoire, ce qui est cohérent avec la situation réelle.

Il convient de noter que les informations pertinentes seront affichées lorsque _CrtDumpMemoryLeaks(); est appelé et _CrtDumpMemoryLeaks(); est placé avant return 0;, donc si nous utilisons des pointeurs intelligents dans main(), les fuites de mémoire seront affichées, mais elles ne le seront pas réellement (à condition qu'il n'y ait pas d'utilisation abusive des pointeurs intelligents), car les pointeurs intelligents dans main() se termineront lorsque la portée de main() se terminera (c'est-à-dire après le retour 0). Donc, pour tester, le pointeur intelligent doit être placé dans la portée locale (c'est-à-dire écrire une fonction puis l'appeler dans main(), ou directement { ... }).
Pratique recommandée :

#define _CRTDBG_MAP_ALLOC   //必须放在#include<crtdbg.h>之前
#include <crtdbg.h>
#include <stdlib.h>
#define NEW_WITH_MEMORY_LEAR_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
#define new NEW_WITH_MEMORY_LEAR_CHECKING

#include <iostream>
#include <memory>

//智能指针的操作放在这个局部作用域中
void func() {
    
    
    //TODO
	auto p = std::make_shared<int>(10);

	return;
}

int main() {
    
    	
	func();
 
	_CrtDumpMemoryLeaks();
	return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43003108/article/details/121099729
conseillé
Classement