2012-01-22 36 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沒有它正在使用有幾分混淆問題:)