Je viens d'écrire moi-même un arbre binaire pour tester l'utilisation de _CrtDumpMemoryLeaks
Le code est le suivant. Je l'ai suivi avec des points d'arrêt et j'ai constaté que tous les nœuds ont été supprimés, mais il y a toujours une invite dans la fenêtre de sortie
#include "stdafx.h"
#include <iostream>
#include <string>
#include <crtdbg.h>
class Node
{
public:
int data;
Node *lchild;
Node *rchild;
Node(int d) : data{ d }, lchild{ NULL }, rchild{ NULL } {}
};
class tree
{
public:
Node *root;
tree() : root{ NULL } {}
void build()
{
root = new Node(5);
root->lchild = new Node(6);
root->rchild = new Node(7);
root->lchild->lchild = new Node(8);
root->lchild->rchild = new Node(9);
in(root);
}
void remove(Node *node)
{
if (node->lchild != NULL)
{
remove(node->lchild);
}
if (node->rchild != NULL)
{
remove(node->rchild);
}
delete node;
}
void in(Node *node)
{
if (node->lchild != NULL)
{
preorder(node->lchild);
}
std::cout << node->data << " ";
if (node->rchild != NULL)
{
preorder(node->rchild);
}
}
~tree()
{
remove(root);
}
void convert(std::string &pre, std::string &in)
{
}
};
int main()
{
tree t;
t.build();
_CrtDumpMemoryLeaks();
return 0;
}
J'ai deux questions à vous poser ici :
Où est la fuite de mémoire dans ce code simple
Comment savoir où se trouve votre propre fuite de mémoire à partir des informations rapides fournies par _CrtDumpMemoryLeaks
给出的提示信息得出自己内存泄漏之处, 需要那些基础知识? 再具体些, _CrtDumpMemoryLeaks
给出的地址0x02EE2880
等如何从代码中迅速找到, 毕竟写多点的话肯定不能手动找啊. 以及 09 00 00 00 00....
, de quelles connaissances de base avez-vous besoin ? Pour être plus précis, comment trouver rapidement l'adresse 0x02EE2880
donnée par
09 00 00 00 00....
?
_CrtDumpMemoryLeaks(); quand t n'a pas encore été détruit
Changez-le par ceci
Regardez les données dans le message d'invite, c'est la chaîne 09 00 00 00 que vous avez mentionnée, c'est le contenu de la mémoire divulguée
Les octets 0 à 3 sont des entiers, little endian ; 4 à 7 et 8 à 11 sont respectivement des pointeurs gauche et droit, et la somme est new Node(9);