【问题标题】:c++ overloading: overload of operator =c++ 重载:运算符 = 的重载
【发布时间】:2014-08-08 13:40:19
【问题描述】:

我遇到了一些关于 operator= 重载的问题。 我的代码是

#include <stdlib.h>
#include <iostream>


const std::size_t DIM = 10;


template <typename T>

class rowvec
  {
    private:
      T* m_pnt;
      std::size_t m_dim;

    public:
      rowvec();
      rowvec(std::size_t);
      ~rowvec();

      rowvec<T>& operator=(const rowvec<T>& x);

      T* pnt();
  };


template <typename T>
rowvec<T>::rowvec()
  {
    m_dim = DIM;
    m_pnt = (T*) calloc (DIM ,sizeof(T));
  }


template <typename T>
rowvec<T>::rowvec(std::size_t n)
  {
    m_dim = n;
    m_pnt = (T*) calloc(m_dim,sizeof(T));
  }


template <typename T>
rowvec<T>::~rowvec()
      {free(m_pnt);}


template <typename T>
rowvec<T>& rowvec<T>::operator=(const rowvec<T> &x)
  {
    std::cout << "hello" << std::endl;
    if (this != &x)
      {
        free (m_pnt);
        this->m_dim=x.m_dim;
        m_pnt = (T*) calloc (m_dim,sizeof(T));
        for (int i=0; i!=m_dim; i++)
          *(m_pnt+i)=*(x.m_pnt+i);
      }
    return *this;
  }


template <typename T>
T* rowvec<T>::pnt()
  {return m_pnt;}  




int main()
  {
    rowvec<int> k(3);

    rowvec<int> c=k;

    std::cout << "ok" << std::endl;

    return 0;
  } 

没有编译错误,但是我运行的时候结果是:

ok
*** Error in `./blog': double free or corruption (fasttop): 0x0000000001a5e010 ***

如果我以这种方式更改代码:

int main()
  {
    rowvec<int> k(3);

    rowvec<int> c;

    c=k;

    std::cout << "ok" << std::endl;

    return 0;
  }

一切正常(输出为)

hello
hello
ok

有没有办法允许像“rowvec c=k;”这样的声明?

【问题讨论】:

  • 你需要一个拷贝构造函数
  • 使用向量,不需要添加任何拷贝构造函数或赋值运算符。
  • 即使你修复了分配错误,你的课程也会在你尝试rowvec&lt;std::string&gt; 时立即崩溃。原因是您使用的是calloc,而calloc 不构造对象。通常,您在 C++ 程序中使用 C 构造,而这些 C 构造不适用于非 POD 类型。

标签: c++ pointers operator-overloading operators


【解决方案1】:

即使其中有一个=rowvec&lt;int&gt; c=k; 也是复制初始化并使用复制构造函数而不是复制赋值运算符。

由于您的类没有定义一个,因此使用简单地执行成员复制的默认类。这只会复制指针,这会导致双重释放,因为ck 的析构函数都会在同一个指针上调用free()

给你的类一个合适的拷贝构造函数(做一个深拷贝),双重删除应该消失。

另外,您使用的是 C++。不要使用calloc/free。使用newdelete

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2016-04-08
    • 2012-06-02
    • 2014-01-14
    • 2013-03-23
    • 2013-12-03
    • 2013-06-07
    相关资源
    最近更新 更多