我班上遇到了析构函数问题。 主要思想是在未定义的长度向量中使用运算符重载。你可以创建一个像RealVector(3)一样模拟欧几里德矢量的对象,然后使用函数fillvec()来填充x,y,z位置的表格。
问题是当我尝试使用析构函数删除表的alocated内存时。
这是我的代码:
class RealVector{
private:
int dim;
double* tab;
public:
RealVector(int dim){
tab=new double[dim];
}
RealVector(const RealVector & other){
dim=other.dim;
tab=new double[other.dim];
for(int i=0; i<dim; i++){
tab[i]=other.tab[i];
}
}
void fillvec(){
for(int i=0; i<dim; i++){
cin >> tab[i];
}
}
void wri(){
cout << "Vector [";
for(int i=0; i<dim; i++){
cout << tab[i];
if(i!=dim-1)
cout<<", ";
}
cout << "]";
}
RealVector operator+(RealVector & o){
for(int i=0; i<dim; i++)
tab[i]+=o.tab[i];
return *this;
}
~RealVector(){
delete [] tab;
}
}
int main(){
RealVector* w1=new RealVector(3);
RealVector* w2=new RealVector(3);
RealVector* answerr=new RealVector(3);
w1->fillvec();
w2->fillvec();
*answerr=*w1+*w2;
answerr->wri();
}
有人可以解释我犯错的地方吗?
答案 0 :(得分:3)
我在这里可以看到几个关键错误。
我认为第一个是主要的(在你的情况下)。构造函数RealVector(int dim)
未初始化dim
成员。此dim
稍后在许多成员函数中使用,而它的值未初始化。您可以通过以下方式修复它:
RealVector(const int _dim) : dim{_dim}
{
tab=new double[dim];
}
第二个错误是dim
中的operator+
属于当前对象,可能大于dim
的{{1}}宾语。您应该使用o
代替。
第三个一个(感谢Mooing Duck指出)是你错过了std::min(dim, o.dim)
实现。默认赋值运算符仅执行“平面”副本。由于您使用的是动态内存分配,因此在operator=
中实现“深层”副本至关重要。您可以找到示例here。
修改强>
由于此处已标记operator=
,因此我强烈建议您使用smart pointers以及move constructor和move assignment。