c++ - 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__);
}
解决方案
- 您的函数
annexe
将 aChaine
作为参数,在调用时将复制该参数(您没有将参数声明为引用)。 - 您没有为 class定义Copy Constructor
Chaine
,因此将使用默认值。它对所有数据进行基本的按位复制,*_data
包括Chaine
. *data
当函数结束时,副本被销毁,并在你的析构函数中释放后面的相应数据(副本) 。- 稍后您释放 的“原始”
*_data
,这是一个双重删除。