C ++二进制搜索树模板类内存泄漏

时间:2018-04-10 22:29:52

标签: c++11 memory-leaks binary-search-tree

新手问题。我正在尝试编写二进制搜索树,但是甚至 一个简单的插件有内存泄漏。

File Node.h

template<typename X> struct Node {
   X value;
   Node* left;
   Node* right;

   Node(X x) {
      this->value = x;
      this->left = nullptr;
      this->right = nullptr;
   }
};

文件BST.h

template <typename X> class BST {
   public:
      BST() { root = nullptr; }

      bool Insert(const X& x) { return InsertAt(root, x); }

   private:

      bool InsertAt(Node<X>*& node, const X& x)
      {
         if (node == nullptr) {
            node = new Node<X>(x);
            return true;
         }

         if (node->value == x)
            return false;

         if (*(node->value) > *x)
            return InsertAt(node->left, x);

         return InsertAt(node->right, x);
      }

//----

      Node<X>* root;
};

主程序

#include "Node.h"
#include "BST.h"

int main(int argc, char **argv)
{
   BST<int*> bst;
   bst.Insert(new int(8));
}

g ++的输出-g -fsanitize = address -fno-omit-frame-pointer -std = c ++ 11 B.cpp     == 10646 ==错误:LeakSanitizer:检测到内存泄漏

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x7fb5e7f45532 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x99532)
    #1 0x400eb7 in BST<int*>::InsertAt(Node<int*>*&, int* const&) /home/gc/BST.h:12
    #2 0x400e68 in BST<int*>::Insert(int* const&) /home/gc/BST.h:5
    #3 0x400d09 in main /home/gc/B.cpp:22
    #4 0x7fb5e778082f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

Indirect leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x7fb5e7f45532 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x99532)
    #1 0x400caf in main /home/gc/B.cpp:22
    #2 0x7fb5e778082f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

SUMMARY: AddressSanitizer: 28 byte(s) leaked in 2 allocation(s).

首先,为什么我会出现内存泄漏?第二,为什么我收到消息 关于新的(unsigned long)什么时候我的程序没有任何unsigned长期? 感谢。

你可以告诉我使用智能指针,但是现在我只是想尝试 教育自己关于指针并试图弄清楚为什么这不起作用。

1 个答案:

答案 0 :(得分:0)

如果您不打算使用智能指针,则必须将每个newdelete配对。由于您在每个类的构造函数中调用new,因此您可以在析构函数中delete

无论如何,在BST中,析构函数应该是

~BST() { delete root; }

Node中,它是

~Node() { delete left; delete right; }

这将以递归的方式在树下工作。您的递归情况是指向节点的指针不为空。与free崩溃的delete不同,nullptr根本不执行任何操作,使 $("#exist-tags span.tag").on("click", function (e) { var clicked = $(this).html(); console.log("=> " + clicked); $("#userTagsContainer").append('<input class="tag" type="hidden" name="tagsList[]">' + clicked); }); 成为您的基本情况。

查看http://en.cppreference.com/w/cpp/language/destructor