Heim  >  Fragen und Antworten  >  Hauptteil

c++ – Über _CrtDumpMemoryLeaks

Ich habe gerade selbst einen Binärbaum geschrieben, um die Verwendung von _CrtDumpMemoryLeaks zu testen. Ich habe ihn mit Haltepunkten verfolgt und festgestellt, dass alle Knoten gelöscht wurden, aber im Ausgabefenster wird immer noch eine Eingabeaufforderung angezeigt

#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;
}

Ich habe hier zwei Fragen an dich:

  1. Wo ist der Speicherverlust in diesem einfachen Code?

    Wie finden Sie anhand der Eingabeaufforderungsinformationen von
  2. heraus, wo sich Ihr eigener Speicherverlust befindet? Welche Grundkenntnisse benötigen Sie? Genauer gesagt: Wie können Sie die von
  3. angegebene Adresse 0x02EE2880 schnell finden? aus dem Code? Wenn es mehr sind, kann man definitiv nicht manuell suchen. Und was bedeutet 09 00 00 00 00....?

    _CrtDumpMemoryLeaks给出的提示信息得出自己内存泄漏之处, 需要那些基础知识? 再具体些, _CrtDumpMemoryLeaks给出的地址0x02EE2880等如何从代码中迅速找到, 毕竟写多点的话肯定不能手动找啊. 以及 09 00 00 00 00....

ringa_leeringa_lee2736 Tage vor771

Antworte allen(1)Ich werde antworten

  • phpcn_u1582

    phpcn_u15822017-05-16 13:25:55

    _CrtDumpMemoryLeaks();的时候 t 还没有析构啊

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

    改成这样

    从提示信息的data来找,就是你说的09 00 00 00那一串,这就是泄露内存的内容

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

    0-3字节是int,小端序;4-7和8-11分别是左右指针,和起来就是new Node(9);

    Antwort
    0
  • StornierenAntwort