C++ I';我在C+;中使用delete运算符时遇到问题+;。我总是得到一个“答案”;双重自由或腐败(fasttop)“;运行时出错

C++ I';我在C+;中使用delete运算符时遇到问题+;。我总是得到一个“答案”;双重自由或腐败(fasttop)“;运行时出错,c++,memory,binary-search-tree,delete-operator,C++,Memory,Binary Search Tree,Delete Operator,这是完整的错误消息 差不多就是这样。。。我用以下几行代码来澄清: *** glibc detected *** ./bst: double free or corruption (fasttop): 0x083770b0 *** ======= Backtrace: ========= /lib/libc.so.6[0x975e31] /software/common/gcc/lib/libstdc++.so.6(_ZdlPv+0x1f)[0x266b8f] ./bst[0x804976e] .

这是完整的错误消息

差不多就是这样。。。我用以下几行代码来澄清:

*** glibc detected *** ./bst: double free or corruption (fasttop): 0x083770b0 ***
======= Backtrace: =========
/lib/libc.so.6[0x975e31]
/software/common/gcc/lib/libstdc++.so.6(_ZdlPv+0x1f)[0x266b8f]
./bst[0x804976e]
./bst[0x804919a]
./bst[0x8048ff4]
/lib/libc.so.6(__libc_start_main+0xe6)[0x91bd26]
./bst[0x8048981]
======= Memory map: ========
0021f000-002fa000 r-xp 00000000 00:14 3229873    /software/common/gcc-     4.8.1/lib/libstdc++.so.6.0.18
002fa000-002fe000 r--p 000db000 00:14 3229873    /software/common/gcc-4.8.1/lib/libstdc++.so.6.0.18
002fe000-002ff000 rw-p 000df000 00:14 3229873    /software/common/gcc-4.8.1/lib/libstdc++.so.6.0.18
002ff000-00306000 rw-p 00000000 00:00 0
0045c000-0045d000 r-xp 00000000 00:00 0          [vdso]
00752000-00770000 r-xp 00000000 fd:00 42112      /lib/ld-2.12.so
00770000-00771000 r--p 0001d000 fd:00 42112      /lib/ld-2.12.so
00771000-00772000 rw-p 0001e000 fd:00 42112      /lib/ld-2.12.so
00774000-0079c000 r-xp 00000000 fd:00 44717      /lib/libm-2.12.so
0079c000-0079d000 r--p 00027000 fd:00 44717      /lib/libm-2.12.so
0079d000-0079e000 rw-p 00028000 fd:00 44717      /lib/libm-2.12.so
00905000-00a96000 r-xp 00000000 fd:00 42155      /lib/libc-2.12.so
00a96000-00a98000 r--p 00191000 fd:00 42155      /lib/libc-2.12.so
00a98000-00a99000 rw-p 00193000 fd:00 42155      /lib/libc-2.12.so
00a99000-00a9c000 rw-p 00000000 00:00 0
00b20000-00b3b000 r-xp 00000000 00:14 3229870    /software/common/gcc-4.8.1/lib/libgcc_s.so.1
00b3b000-00b3c000 rw-p 0001a000 00:14 3229870    /software/common/gcc-4.8.1/lib/libgcc_s.so.1
08048000-0804d000 r-xp 00000000 00:1a 31125426   /home/linux/ieng6/cs100w/bhn013/P1/bst
0804d000-0804e000 rw-p 00004000 00:1a 31125426   /home/linux/ieng6/cs100w/bhn013/P1/bst
08377000-08398000 rw-p 00000000 00:00 0          [heap]
b77d1000-b77d4000 rw-p 00000000 00:00 0
b77ec000-b77ef000 rw-p 00000000 00:00 0
bfa01000-bfa17000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)

我一点也不知道该怎么做

current=nullptr此行没有任何作用。它会更改一个立即超出范围的局部变量

在下一次迭代中,您将再次找到同一个节点,但是您释放了它(
delete
),因此访问它是未定义的行为


如果只是想释放树,则需要将BST中指向此节点的指针更新为
nullptr

,然后只需执行此操作即可

virtual ~BST() {
clear();
}

BST()
的析构函数应该只删除
left
right
。递归将处理其余部分。

变量“current”在
while(1){}
块中定义,并在循环的每次迭代中使用“root”值初始化,因此第一次通过循环时,删除左/右分支,然后删除“root”,设置current==nullptr。但是,然后重复该循环并再次将current重新定义回“root”的值。这会导致您再次尝试删除分支和“根”,这是一个双重自由

将“当前”的定义移到while(1)循环之外。或者更好的是,删除while(1)循环,因为它不是必需的,您总是在一次迭代中退出

void clear() {
    delete root;
    root = nullptr;
}

我猜这部分以迭代方式执行删除过程

这可能是删除BST最有效的方法。为什么不编写一个Resursion函数?在退出时进行后序遍历并通过引用删除节点?clear()做什么?它应该把整棵树都放出来吗?如果是这样的话,你将使这个方法变得比必要的更复杂。我们不能使用递归函数,它是赋值的一部分。。。我希望我可以。每次删除都要遍历整个树有点疯狂。对不起,我应该更清楚一点。删除树时不应该有任何内存泄漏。使用该选项,valgrind会显示一些漏洞。@user3217373您使用的是valgrind?。优秀的我只想提一下,“递归将处理其余的…”除非树足够深,递归溢出堆栈。看,这里没有指针:
a=3;a=0。第二次赋值后,
3
的值是否会改变?显然不是。很抱歉回复得太晚,但a=3的事情让我大吃一惊!哈哈。多亏了这个比喻,我现在明白了。我也成功了!非常感谢
void clear() {
    delete root;
    root = nullptr;
}
while(current->left || current->right)
{
  if(current->left)
  {
    current = current->left;
  }
  else if(current->right)
  {
    current = current->right;
  }
}
delete current;