默认/复制/移动构造函数的正确性。

时间:2015-02-12 04:43:28

标签: c++ memory copy-constructor

我没有使用复制构造函数/移动构造函数,我试图将它们包含在我正在编写的稀疏矩阵和向量库中。我认为一切都很好,一切运行良好,运算符重载似乎是成功的等等。然后我继续编写一些基本的迭代方法,并遇到了令人衰弱的内存错误。我相信它与我的构造函数和赋值运算符有关,如下所示:

/* Default constructor. */
CSC_Vector::CSC_Vector()
{
    m_length  = 0.;
    m_values = new double[0];
}

/* Constructor for vector of given input length. Initializes to 0 default. */
/* Input: unsigned int - length                                            */
CSC_Vector::CSC_Vector(const unsigned int & length)
{
    m_length = length;
    m_values = new double[length]();
}

/* Copy constructor. */
CSC_Vector::CSC_Vector(const CSC_Vector & vec) 
{
    // Copy vector length and values. 
    m_length = vec.m_length;
    m_values = new double[m_length];
    for(int i=0; i<m_length; i++) {
        m_values[i] = vec(i);
    }
}

/* Move constructor. */
CSC_Vector::CSC_Vector(CSC_Vector && vec) 
{
    // Move vector length and values to current object.
    m_values = vec.m_values;
    m_length = vec.m_length;
    vec.m_values = nullptr;
    vec.m_length = 0;   
}

/* Copy assignment operator. */
CSC_Vector& operator=(const CSC_Vector & vec) {
    cout << "Copy assign vector." << endl;
    delete [] m_values; 
    m_length = vec.m_length;
    m_values = new double[vec.m_length];
    for(int i=0; i<m_length; i++) {
        m_values[i] = vec(i);
    }
    return *this;
};
/* Move assignment operator. */
CSC_Vector& operator=(CSC_Vector && vec) {
    cout << "Move assign vector." << endl;
    delete [] m_values;
    m_length     = vec.m_length;
    m_values     = vec.m_values;
    vec.m_length = 0;
    vec.m_values = nullptr;
    return *this;
};

构造函数在类.cpp文件中定义,并在头文件中定义赋值运算符。对于那些有经验的人来说,这是一个非常简单的问题:这段代码中有问题吗?我尝试根据我在互联网上阅读的内容以及Stroustrup在第4版中对其进行的处理来编写这些内容,但在某些地方我做了一些严重的错误。

我间歇性地得到两种错误:

  1. 释放对象的校验和不正确 - 对象可能在被释放后被修改。
  2. Seg fault 我尝试了valgrind,但它还没有帮助。

0 个答案:

没有答案