C ++动态数组析构函数错误

时间:2015-12-29 05:07:57

标签: c++ constructor destructor copy-constructor

我有一个包含行和列的稀疏矩阵类。 rows integer用于初始化动态数组中的LinkedList数。

template<class T>
SM<T>::SM(int rows, int columns)
{
    this->rows = rows;
    this->columns = columns;
    this->rowList = new LinkedList<T>[rows];
    cout << "Going to create a sparse matrix of dimensions " << this->rows << "-" << this->columns << endl;
}

我也有这个拷贝构造函数供以后使用:

修改

LinkedList拷贝构造函数:

LinkedList(const LinkedList & other) {
    this->size = other.size;
    this->head = NULL;
    this->tail = NULL;
    NodeType<T> * current = other.head;
    while (current != NULL) {
        setValue(current->info, current->index);
        current = current->link;
    }
}

SparseMatrix拷贝构造函数:

template<class T>
SM<T>::SM(const SM<T> & other)
{
    this->rows = other.rows;
    this->columns = other.columns;
    this->rowList = new LinkedList<T>[this->rows];
    for (int i = 0; i < this->rows; i++)
    {
        rowList[i] = other.rowList[i];
    }
}

这是我的LinkedList析构函数和SparseMatrix destrcutor:

~LinkedList() {
    cout << "Going to delete all " << size << " elements of the list." << endl;
    NodeType<T> * current = head;
    while (current != NULL) {
        current = current->link;
        delete head;
        head = current;
    }
}

template<class T>
SM<T>::~SM()
{
    cout << "Deleting sm" << endl;
    delete [] rowList;
    rowList = NULL;
}

然而,当我完成代码时。我得到了析构函数错误。

这是我的主要():

SM<int> sm(rows, columns);
SM<int> sm2(rows, columns);
SM<int> sm3 = sm2;

这是错误:

  

_CrtIsValidHeapPointer

我是C ++的新手,我真的不知道我的代码有什么问题。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

一个问题是,您的LinkedList课程缺少assignment operator.,即

LinkedList<T>& operator=(const LinkedList<T>& other);

你需要这个函数的原因是没有它,这样的赋值(来自你的构造函数):

rowList[i] = other.rowList[i];

将创建浅拷贝(复制内部指针值),这不是我们想要的。由于rowList[i]other.rowList[i]是单独的对象,因此它们必须在内部具有单独的指针。如果没有,rowList[i]other.rowList[i]的析构函数在发出对delete的调用时将使用相同的指针值,从而导致未定义的行为。

假设您的LinkedList拷贝构造函数和析构函数正常工作。实现赋值运算符的最简单方法是使用 copy / swap idom

#include <algorithm>
//...
LinkedList<T>& operator=(const LinekedList<T>& other)
{
   LinkedList<T> temp(other); // uses copy constructor
   std::swap(temp.size, size);
   std::swap(temp.head, head);
   std::swap(temp.tail, tail);
   return *this;
}

请注意,我们所做的只是创建一个临时的,并使用this替换临时的所有成员,并返回*this

请注意,您需要使用相同的技术(复制/交换)为SM类实现赋值运算符,并保持简单。