为什么我在运行C++脚本后会得到双自由度或腐败(top)?

为什么我在运行C++脚本后会得到双自由度或腐败(top)?,c++,debugging,C++,Debugging,我有以下代码: Class Chain 与 作为唯一的公共前庭 istream& operator>>(istream& i, Chain& s) { delete [] s.c; const int L = 256; char *t = new char[L]; i.getline(t,L); s.c = t; return i; } ostream& operator<<(ostream& o, Ch

我有以下代码:

Class Chain

作为唯一的公共前庭

istream& operator>>(istream& i, Chain& s) {
  delete [] s.c;
  const int L = 256;
  char *t = new char[L];
  i.getline(t,L);
  s.c = t;
  return i;
}

ostream& operator<<(ostream& o, Chain s) {
  o << s.c;
  return o;
}

#include <iostream>
#include "Chain.h"
using namespace std;

int main(){

      Chain id;

      cin >> id;

      cout << id;
      cout << id;
在Xubuntu上一个版本的Eclipse IDE下运行代码后,出现以下错误:

[…]双自由或损坏顶部出错:0x00000000008fd290***

有什么问题吗?

您的类链很可能有一个正在销毁c的析构函数。因此,在这一行:

delete [] s.c;
您正在删除c,然后当链被删除时,它会再次尝试销毁c,发现它已经被删除,您正在执行双重释放

ostream& operator<<(ostream& o, Chain s) {

这不是s上的引用,它正在构建一个完整的副本,可能有一个析构函数删除所使用的内存。既然你调用了两次,它就被删除了两次。< / P>是的,我有那个析构函数,我应该删除它吗?不,即使你删除了析构函数,C++也会默认地为你创建一个析构函数。最好定义一个,以便知道删除的内容/方式。@user3166611:这样做只会导致内存泄漏。靠猜测编程是行不通的。我认为这不是问题所在。他正在删除s.c.以前的内容,因为他要重新分配它。当析构函数运行时,它只删除最后一个,其他的删除应该没有问题。@Barmar:我看不出除了违反0/3/5规则之外还有什么其他原因。关键是意外复制。但是,我们没有所有的信息。请发一个。请包括一个。这个问题的每一个答案都会包括对链内部的猜测,这很糟糕。@GrahamS在这里很可能帮不上忙,因为OP可能搞砸了复制构造函数。如果这个问题处于可回答状态,对于stackoverflow.com/questions/4172722/what-is-the-rule-of-ThreeWhyyyyyyyyyy原始动态分配,它很可能会被欺骗?!为什么要投三张赞成票?!可能是真的。尽管如此,回答需要猜测的问题会给OP留下错误的印象。请尽量避免回答问题,直到问题正确形成为止!我认为心灵远程调试是超级甜蜜和可怕的@Lexness CraceSin轨道,这是C++,不是魔法8球。根据显示的代码和结果,我非常确定我的答案,这足够好,至少可以启动调试会话。@Blindy:嗯,确切地说:堆栈溢出问题不是调试会话。
ostream& operator<<(ostream& o, Chain s) {