清理循环链表的内存时遇到严重麻烦。我想我理解这个问题。我的头指针有N个分配,而构建指针有N-1个分配。 addback函数只能有一个整数,我不能使用容器或向量。
void Queue::addBack(int passed_Val)
{
if (head == nullptr) //takes care of first node when list is empty
{
head = new QueueNode;//head is my building now
cout<<"head is "<<sizeof(head)<<" bytes"<<endl;
head->val = passed_Val;
head->next = head;//this make an infinite loop
head->prev = head;
cout<<"node[0] mem allocated "<<head<<endl;
}
else
{
//build next will always have N-1 address,where N = number of addresses
//head points to. I don't want build to point to head when N=1
// have tempPtr point to old address
QueueNode* tempPrev = head->prev;//this will always point to the last node added!
QueueNode* build = new QueueNode;
build->next=head;
cout<<"build is "<<sizeof(build)<<" bytes"<<endl;
cout<<"node[1] mem allocated "<< build <<endl;
cout<<"node[1] "<< head <<endl;
build->val=passed_Val;
build->next = head;
head->prev = build;
tempPrev->next = build;
build->prev = tempPrev;
}
我的析构函数如下所示
Queue::~Queue()
{
if(head !=nullptr)//needed because i don't want to deallocate head if it was never called
{
QueueNode* deletePtr = head->next;
cout<<"deallocating node[0] "<<head<<endl;
delete head;
while(deletePtr !=head)
{
delete deletePtr;
cout<<"deallocating pointer "<<deletePtr<<endl;
deletePtr =deletePtr->next;
}
}
}
我已经考虑过在(head == nullptr)条件下使构建指针等于head指针,但是我遇到了更多问题。这是我的valgrind的结果
我认为这是我的主要问题 == 30923 ==地址0x5a225e0是大小为24的块中的0个字节
因此,如果我理解正确,我正在尝试释放已经释放的内存?如何在析构函数中解决此问题?我试图弄乱我的addback函数,但最终会丢失节点或出现更多的内存泄漏:(