我有一个包含行和列的稀疏矩阵类。 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 ++的新手,我真的不知道我的代码有什么问题。非常感谢任何帮助。
答案 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
类实现赋值运算符,并保持简单。