//==========set method===================
Node *temp = new Node(data, i, j, NULL, NULL);
addNode(temp, this->rowsArr[i], true);
addNode(temp, this->colsArr[j], false);
}
//==============================================================
void SMatrix::addNode(Node *temp, Node *&list, bool colOrRow) {
//check if the list is empty.
if (list == NULL)
list = temp;
else {
//true means rows array.
if (colOrRow == true) {
//check if the new node needs to be in the first place of the list.
if (list->colIndex > temp->colIndex) {
temp->nextInRow = list;
list = temp;
return;
}
for (Node *p = list; p != NULL; p = p->nextInRow) {
if (p->nextInRow == NULL) {
p->nextInRow = temp;
return;
}
if (p->nextInRow->colIndex > temp->colIndex) {
temp->nextInRow = p->nextInRow;
p->nextInRow = temp;
return;
}
}
}
//false means column array.
else if (colOrRow == false) {
//check if the new node needs to be in the first place of the list.
if (list->rowIndex > temp->rowIndex) {
temp->nextInCol = list;
list = temp;
return;
}
for (Node *p = list; p != NULL; p = p->nextInCol) {
if (p->nextInCol == NULL) {
p->nextInCol = temp;
return;
}
if (p->nextInCol->rowIndex > temp->rowIndex) {
temp->nextInCol = p->nextInCol;
p->nextInCol = temp;
return;
}
}
}
}
上面的代码是为矩阵添加一个节点(包含两个数组 - 行和列,每个单元格包含节点的链接列表)。
代码对我来说很好,但我从“set方法”(来自Node* temp
,你可以猜到)有内存泄漏,如果我删除temp
(或释放临时)添加,我得到分段错误。有帮助吗?
答案 0 :(得分:0)
SMatrix::addNode
似乎没有问题,但您将temp
插入到两个不同的列表中:
Node *temp = new Node(data, i, j, NULL, NULL);
addNode(temp, this->rowsArr[i], true);
addNode(temp, this->colsArr[j], false);
如果您delete temp
,插入列表中的节点将变为无效,并且取消引用它们会调用未定义的行为。
如果您从一个列表中删除并删除该节点,而不是从另一个列表中删除,则同样的事情。
问题在于处理对象的生命周期。 Java会帮助你使用垃圾收集器,C ++没有。要避免多次删除同一节点,您需要:
rowsArr[]
列表并重置colsArr[]
列表而不删除其元素。