c++ - À propos de _CrtDumpMemoryLeaks
ringa_lee
ringa_lee 2017-05-16 13:23:55
0
1
775

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 :

  1. Où est la fuite de mémoire dans ce code simple

  2. 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

    à partir du code ? Après tout, écrivez S'il y en a plus, vous ne pouvez certainement pas rechercher manuellement. Et que représente 09 00 00 00 00.... ?
🎜
ringa_lee
ringa_lee

ringa_lee

répondre à tous(1)
phpcn_u1582

_CrtDumpMemoryLeaks(); quand t n'a pas encore été détruit

int main()
{
    {
        tree t;
        t.build();
    }
    _CrtDumpMemoryLeaks();
    return 0;
}

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

09 00 00 00| 00 00 00 00| 00 00 00 00

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);

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal