新手问题。我正在尝试编写二进制搜索树,但是甚至 一个简单的插件有内存泄漏。
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长期? 感谢。
你可以告诉我使用智能指针,但是现在我只是想尝试 教育自己关于指针并试图弄清楚为什么这不起作用。
答案 0 :(得分:0)
如果您不打算使用智能指针,则必须将每个new
与delete
配对。由于您在每个类的构造函数中调用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);
});
成为您的基本情况。