C++ C+上的双自由错误+;复制构造函数
我在这段代码上有一个双重免费或损坏(fasttop)错误。 我想我错过了“复制构造函数”中的某些内容 上述=运算符不调用复制构造函数。为什么? 上面写着:“双重自由或腐败(fasttop)”和C++ C+上的双自由错误+;复制构造函数,c++,pointers,C++,Pointers,我在这段代码上有一个双重免费或损坏(fasttop)错误。 我想我错过了“复制构造函数”中的某些内容 上述=运算符不调用复制构造函数。为什么? 上面写着:“双重自由或腐败(fasttop)”和 a = Vector(12) 有几件事正在发生: 首先创建一个新的临时Vector对象(从Vector(12))。这是使用向量(int)构造函数构造的 class Vector{ int taille; int* ptr; public: Vector():taille(0)
a = Vector(12)
有几件事正在发生:
Vector
对象(从Vector(12)
)。这是使用向量(int)
构造函数构造的class Vector{
int taille;
int* ptr;
public:
Vector():taille(0), ptr(NULL){
...
}
Vector(int n){
...
}
//The most important one
Vector(const Vector& source){
if(source.ptr != NULL){
taille = source.taille;
ptr = new int[taille];
for(int i=0;i<taille;i++) ptr[i]=source.ptr[i];
}else{
taille=0;
ptr=NULL;
}
cout << "Copy constructor" << endl;
}
~Vector(){
if(ptr!=NULL) delete ptr;
}
};
a.operator=()
将临时对象分配给a
默认编译器生成的operator=
函数执行简单的成员赋值,即它基本上执行ptr=other.ptr
。这意味着您现在有两个对象ptr
成员指向同一内存:临时对象和a
delete
(实际上应该是delete[]
)
这当然意味着a.ptr
不再指向有效内存,当它随后超出范围并被破坏时,您尝试删除已删除的内存
=
符号可以用于复制构造,如中所示
Vector a = b; // This is a copy-construction
// The copy-constructor of `a` is called with
// a reference to `b` as argument
// It's equal to `Vector a(b)`
这和作业很不一样
a = b; // This is a plain assignment
// It is equal to `a.operator=(b)`
通过以下方法之一解决了碰撞问题 我还建议您阅读带有表达式的,例如..
a = Vector(12)
有几件事正在发生:
Vector
对象(从Vector(12)
)。这是使用向量(int)
构造函数构造的class Vector{
int taille;
int* ptr;
public:
Vector():taille(0), ptr(NULL){
...
}
Vector(int n){
...
}
//The most important one
Vector(const Vector& source){
if(source.ptr != NULL){
taille = source.taille;
ptr = new int[taille];
for(int i=0;i<taille;i++) ptr[i]=source.ptr[i];
}else{
taille=0;
ptr=NULL;
}
cout << "Copy constructor" << endl;
}
~Vector(){
if(ptr!=NULL) delete ptr;
}
};
a.operator=()
将临时对象分配给a
默认编译器生成的operator=
函数执行简单的成员赋值,即它基本上执行ptr=other.ptr
。这意味着您现在有两个对象ptr
成员指向同一内存:临时对象和a
delete
(实际上应该是delete[]
)
这当然意味着a.ptr
不再指向有效内存,当它随后超出范围并被破坏时,您尝试删除已删除的内存
=
符号可以用于复制构造,如中所示
Vector a = b; // This is a copy-construction
// The copy-constructor of `a` is called with
// a reference to `b` as argument
// It's equal to `Vector a(b)`
这和作业很不一样
a = b; // This is a plain assignment
// It is equal to `a.operator=(b)`
通过以下方法之一解决了碰撞问题
我还建议您阅读,例如:您正在分配
a=Vector(12)
中创建一个临时向量,该向量通过操作符=
分配给a
。临时向量
在赋值语句末尾被销毁,而a
在函数末尾被销毁。由于您没有定义复制分配运算符=
,所以这两个值都指向同一个已分配数组:
您正在分配a=Vector(12)
中创建一个临时向量,该向量通过操作符=
分配给a
。临时向量
在赋值语句末尾被销毁,而a
在函数末尾被销毁。由于您没有定义复制分配运算符=
,所以这两个值都指向同一个已分配数组:
使用删除[]
和新建[]
。不是delete
。您也没有实现operator=()
问题实际上不是复制构造函数,而是复制赋值。我建议你了解一下(我个人推荐最后一个)。@MohammedAit你使用的是delete
,它与delete[]
不同。你已经编辑了你的问题,现在它变得模棱两可。是关于坠机的事吗?为什么会发生?或者是关于为什么作业与复制构造不同?请澄清。请使用delete[]
和new[]
。不是delete
。您也没有实现operator=()
问题实际上不是复制构造函数,而是复制赋值。我建议你了解一下(我个人推荐最后一个)。@MohammedAit你使用的是delete
,它与delete[]
不同。你已经编辑了你的问题,现在它变得模棱两可。是关于坠机的事吗?为什么会发生?或者是关于为什么作业与复制构造不同?请澄清。求你了,你太棒了!请和我分享一些你读过的关于编程的最好的书。我读过“工程师编程——学习C和Matlab的基本方法”,我很喜欢。谢谢你太棒了!请和我分享一些你读过的关于编程的最好的书。我读过“工程师编程——学习C和Matlab的基本方法”,我很喜欢。谢谢