链表中的内存泄漏

时间:2016-01-01 20:38:33

标签: c++ memory-leaks

//==========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(或释放临时)添加,我得到分段错误。有帮助吗?

1 个答案:

答案 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[]列表而不删除其元素。
  • 或复制节点,这是最简单的方法,假设您不需要共享语义。
  • 或故意不删除任何节点。这可能是也可能不是问题,具体取决于程序运行的时间以及它对这些列表的作用。
  • 或使用引用计数来确定何时完成节点。智能指针是实现这一目标的便捷方式。