C ++链表存储器错误

时间:2014-02-05 19:47:59

标签: c++ linked-list

我对C ++很陌生,从来没有考虑过内存管理。 现在我正在创建一个链表,在我尝试验证我的代码之前,一切都会正常运行。 我收到消息“正确回答错误”,错误是:

==23453== Memcheck, a memory error detector
==23453== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==23453== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==23453== Command: ./a.out
==23453== Parent PID: 23452
==23453== 
==23453== 
==23453== HEAP SUMMARY:
==23453==     in use at exit: 32 bytes in 2 blocks
==23453==   total heap usage: 27 allocs, 25 frees, 488 bytes allocated
==23453== 
==23453== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==23453==    at 0x4A075BC: operator new(unsigned long) (vg_replace_malloc.c:298)
==23453==    by 0x401BEA: IntList::endInsert(int) (IntList.cpp:61)
==23453==    by 0x400D77: main (main.cpp:61)
==23453== 
==23453== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2
==23453==    at 0x4A075BC: operator new(unsigned long) (vg_replace_malloc.c:298)
==23453==    by 0x401B1F: IntList::headInsert(int) (IntList.cpp:47)
==23453==    by 0x40111D: main (main.cpp:118)
==23453== 
==23453== LEAK SUMMARY:
==23453==    definitely lost: 32 bytes in 2 blocks
==23453==    indirectly lost: 0 bytes in 0 blocks
==23453==      possibly lost: 0 bytes in 0 blocks
==23453==    still reachable: 0 bytes in 0 blocks
==23453==         suppressed: 0 bytes in 0 blocks
==23453== 
==23453== For counts of detected and suppressed errors, rerun with: -v
==23453== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)

这是我的代码:

#include<iostream>
#include "IntList.h"
#include "IntNode.h"

IntList::IntList()
{
    // Constructor: creates an empty list
    head = NULL;
}

IntList::~IntList()
{
    // Destructor
    removeAll();
    delete head;
}

int IntList::length()
{
    // Returns the length of the list
    NodePtr temp = head;
    int count = 0;

    while (temp != NULL)
    {
        temp = temp->getLink();
        count++;
    }
    return count;
}

void IntList::headInsert(int the_number)
{
    // Inserts a node with value the_number at the head of the list 
    if (head == NULL)
    {
        head = new IntNode(the_number, NULL);
    }
    else
    {
        NodePtr newNode = new IntNode(the_number, head);
        head = newNode;
    }
}

void IntList::endInsert(int the_number)
{
    // Inserts a node with value the_number at the end of the list
    if (head == NULL)
    {
        head = new IntNode(the_number, NULL);
    }
    else
    {
        NodePtr newNode = new IntNode(the_number, NULL);
        NodePtr temp = head;

        while (temp->getLink() != NULL)
        {
            temp = temp->getLink();
        }
        temp->setLink(newNode);
    }
}

void IntList::remove(int the_number)
{

    if (head == NULL)
    {
        return;
    }

    //If head is the only Node left and it's to be removed.
    if (head->getLink() == NULL && head->getData() == the_number)
    {
        head = NULL;
        delete head;
        return;
    }

    // Removes the first instance of a node with value the_number from the list
    NodePtr temp = head;
    if (head->getData() == the_number)
    {
        head = head->getLink();
        delete temp;
        return;
    }

    NodePtr temp2 = head->getLink();
    while (temp2 != NULL)
    {
        if (temp2->getData() == the_number)
        {
            temp->setLink(temp2->getLink());
            delete temp2;
            return;
        }
        temp = temp->getLink();
        temp2 = temp2->getLink();
    }
}

    void IntList::removeAll()
{
    if (head == NULL)
    {
        return;
    }
    // Removes all the nodes in the list
    NotePtr temp = head;
    NodePtr temp2;
    head = NULL;

    while (temp != NULL)
    {
        temp = temp->getLink();
        delete temp2;
        temp2 = temp;
    }
    delete head;
}

void IntList::reverse()
{
    if (head == NULL)
    {
        return;
    }
    // Reverses the order of the nodes in the list
    NodePtr temp = head;
    NodePtr temp2 = temp->getLink();
    NodePtr temp3 = temp2->getLink();

    while (temp3 != NULL)
    {
        temp2->setLink(temp);

        temp = temp2;
        temp2 = temp3;
        temp3 = temp3->getLink();
    }
    temp2->setLink(temp);
    head->setLink(NULL);
    head = temp2;
}

ostream& operator <<(ostream& outs, const IntList& lis)
{
    // A friend function for writing the contents of the list to an output stream
    NodePtr temp = lis.head;
    if (temp == NULL)
    {
        return outs;
    }
    for(NodePtr temp2 = temp; temp2->getLink() != NULL; temp2->getLink()) 
    {
        outs << temp->getData() << " ";
        temp = temp->getLink();
        temp2 = temp;
    }
    outs << temp->getData();

    return outs;
}

有任何建议可以摆脱这个错误吗?

2 个答案:

答案 0 :(得分:5)

不确定。我们来看看你的代码:

head = NULL;
delete head;

您将头设置为NULL,然后尝试删除它。那不行。按其他顺序执行。 :)

答案 1 :(得分:1)

你在析构函数中删除了两次 - 一次在removeAll中,然后在析构函数中删除它。 Valgrind没有抱怨它,所以也许你根本没有在列表上调用删除。

P.S哦,你写了head = NULL;,这就是为什么它没有被分割出来的原因。但是在删除之后你应该删除decstructor中的删除头。