2012-01-22 37 views
-1

因此,我已经写过一个链表类,但现在我需要编写一个链表类模板。没有什么大不了的,但我在删除操作的时候遇到了问题。 我重复使用了尽可能多的代码,但我无法弄清楚为什么我的删除节点的函数在两个程序中的行为都不一样。在我的模板类实现中,当尝试使用delete释放内存时,会出现运行时错误。使用C++链接列表模板的内存管理类

下面是相关代码:

所有节点都在main.cpp中通过以下功能补充说:

template <class T> 
void LinkedList<T>::insert(T data) 
{ 
    if(pHead == NULL) 
    { 
     pHead = new LinkedList<T>(data); 
    } 
    else 
    { 
     LinkedList<T> *ptr = pHead; 
     while(ptr->pNext != NULL) 
     { 
      ptr = ptr->pNext; 
     } 
     ptr->pNext = new LinkedList<T>(data); 
    } 
} 

所有节点都在main.cpp中通过以下功能删除:

template <class T> 
void LinkedList<T>::removeFirst() 
{ 
    if(!pHead) return; 
    else 
    { 
     LinkedList<T> *next = pHead; 
     pHead = pHead->pNext; 
     if(next != NULL) 
     { 
      delete next; 
     } 
    } 
} 

这里是我的析构函数代码:

template <class T> 
LinkedList<T>::~LinkedList() 
{ 
    clear(); 
} 

template <class T> 
void LinkedList<T>::clear() 
{ 
    LinkedList<T> *ptr = pHead; 
    while(ptr) 
    { 
     LinkedList<T> *pTemp = ptr->pNext; 
     delete ptr; 
     ptr = pTemp; 
    } 
    pHead = NULL; 
} 

我在removeFirst函数尝试调用delete时发生访问冲突。 我觉得问题很简单,但几乎完全相同的代码在我的非模板实现中起作用,所以我想在看到别人认为我的头靠在墙上太久之前,想看看其他人的想法。

谢谢。

+0

“LinkedList”的声明在哪里? –

+0

不是这个问题,但是我发现在'reomveFirst'函数中'if(next!= NULL)'没有任何理由,因为您已经检查过'pHead'并将它分配给'next'。 –

+2

通过逐步调试调试器中的代码可以解决问题(或者至少是孤立的)。 –

回答

3

你需要想清楚以下三个功能,并决定他们是否应该只删除一个项目,还是应该清除整个列表:

removeFirst 
clear 
~LinkedList 

就目前而言,所有这些函数都试图清除整个列表。发生崩溃是因为clear中的代码尝试多次删除相同的内容。

我很抱歉地说你的代码在很多方面存在严重缺陷。你可能想以下几点:

~LinkedList() // delete *just this one node*, leaving the rest intact 
clear()  // scan through the list. deleting each node (individually) in turn 
removeFirst // delete just one node. 

delete每次调用导致对~LinkedList调用它,目前,然后试图清除整个列表。

+0

这确实是问题。现在,这里有一个问题:我只是将构造函数设为空,因为如果让它使用编译器提供的默认构造函数,它就不会编译。这是一个好习惯吗?或者我应该踢的坏习惯? – joshuaegclark

+1

我不认为我相信这一点:*“我只是将构造函数设为空,因为如果我让它使用编译器提供的默认构造函数,它就不会编译。”*您需要向我们展示所有相关的码。它给了什么错误? –

0

这只是一个受过教育的猜测,没有看到代码的其余部分,即构造函数或使用pHead,除了在第一个节点。

你打电话给下一个调用〜LinkedList,它将调用clear()。

清除将使用您正在删除的节点的pHead,这是没有意义的,因为它不是第一个节点,我怀疑它没有初始化。

KABOOM

我会建议做一个单独的类进行实际的LinkedList,用添加/删除方法,节点列表(一个LinkedListNode?)只需要一个pNext指针。有在内容节点PHEAD没有它正在使用有几分混淆问题:)