运算符重载,析构函数内存泄漏

时间:2016-05-16 16:10:30

标签: c++ c++11

我班上遇到了析构函数问题。 主要思想是在未定义的长度向量中使用运算符重载。你可以创建一个像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();
}

有人可以解释我犯错的地方吗?

1 个答案:

答案 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 constructormove assignment