我对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;
}
有任何建议可以摆脱这个错误吗?
答案 0 :(得分:5)
不确定。我们来看看你的代码:
head = NULL;
delete head;
您将头设置为NULL,然后尝试删除它。那不行。按其他顺序执行。 :)
答案 1 :(得分:1)
你在析构函数中删除了两次 - 一次在removeAll中,然后在析构函数中删除它。 Valgrind没有抱怨它,所以也许你根本没有在列表上调用删除。
P.S哦,你写了head = NULL;,这就是为什么它没有被分割出来的原因。但是在删除之后你应该删除decstructor中的删除头。