首页 > 解决方案 > C ++中的“双重自由或破坏”错误

问题描述

我有一个名为 Chaine 的类,如下面的代码所示:

 class Chaine {
  unsigned int _size;
  char* _data;

public:
  Chaine();
  ~Chaine();
  Chaine(const char* str);
  unsigned int size() const;
  char get(unsigned int i);
};

我编写了一个函数,它采用 Chaine 的一个实例并且不做任何事情(附件)。在我的主要情况下,当我调用附件(ch1)时,它给了我一个错误,上面写着“双重免费或损坏(fasttop)”。调用附件(ch2)正常工作。如果我将附件函数与对实例的引用一起使用,它可以工作,但我不明白为什么。

void annexe(Chaine s) {
}

int main() {
  Chaine ch1("Achraf");
  Chaine *ch2 = new Chaine("AchrafA");
  printf("%d\n", ch1.size());
  printf("%d\n", ch2->size());

  annexe(ch1);
  annexe(*ch2);

  delete ch2;
  return 0;
}

我的构造函数和析构函数如下:

Chaine::Chaine() {
  _size = 0;
  _data = NULL;
  printf("constructor %s(%d): %s\n", __FILE__,__LINE__,__func__);
}

Chaine::Chaine(const char* str) {
  _size = strlen(str);
  _data = new char[_size+1];
  strcpy(_data, str);
}

Chaine::~Chaine() {
  if (_data != NULL) {
    delete[] _data;
  }
  printf("destructor %s(%d): %s\n", __FILE__,__LINE__,__func__);
}

标签: c++

解决方案


  1. 您的函数annexe将 aChaine作为参数,在调用时将复制该参数(您没有将参数声明为引用)。
  2. 您没有为 class定义Copy ConstructorChaine,因此将使用默认值。它对所有数据进行基本的按位复制,*_data包括Chaine.
  3. *data当函数结束时,副本被销毁,并在你的析构函数中释放后面的相应数据(副本) 。
  4. 稍后您释放 的“原始” *_data,这是一个双重删除。

推荐阅读