リンク リストのオーバーロードされた = 演算子の実装に問題があります。List クラスには、Node* head
ポインターとそれをstruct Node
含むT* data
andが含まれていますNode* next
。ここで、T はテンプレートの型名です。makeEmpty
リストを反復処理して新しいリストを作成した後、演算子の終わりまでにデストラクタ (この場合はによって処理される) が 2 回呼び出されている演算子関数の最後で何が起こっているのかに問題があります。同じノードと、オペレーター関数の終了後に 1 回。
makeEmpty の実装は次のとおりです。
// Does the work of the Destructor
template <typename T>
void List<T>::makeEmpty() {
cout << endl << endl << "DESTRUCTOR CALLED" << endl << endl;
List<T>::Node* tempPtr = head;
if (head != NULL) {
List<T>::Node* nextPtr = head->next;
for(;;) {
if (tempPtr != NULL) {
delete tempPtr->data;
tempPtr = nextPtr;
if (nextPtr != NULL)
nextPtr = nextPtr->next;
/*tempPtr = head->next;
delete head;
head = tempPtr;*/
}
else break;
}
}
}
operator= オーバーロードの実装は次のとおりです。
// Overloaded to be able to assign one list to another
template <typename T>
List<T> List<T>::operator=(const List& listToCopy) {
List<T> listToReturn;
listToReturn.head = NULL;
List<T>::Node* copyPtr = listToCopy.head;
List<T>::Node* thisPtr = head;
if (copyPtr != NULL && thisPtr != NULL) {
for(;;) {
if (copyPtr != NULL) {
T* toInsert = new T(*copyPtr->data);
listToReturn.insert(toInsert);
copyPtr = copyPtr->next;
}
else{cout << endl << listToReturn << endl << endl; return listToReturn;}
}
}
// if right-hand list is NULL, return an empty list
return listToReturn;
}
私は少しデバッグしてきましたが、デストラクタが 2 回目に呼び出されたときに、破棄されるリストの先頭に読み取り不能なメモリが含まれているようです。破棄する必要がある唯一のリストは、返された後の listToReturn であるため、演算子内でデストラクタが 2 回呼び出される理由もわかりません。(多分私の論理はどこかに欠陥があります...私はこれについてあまりにも長い間考えてきました)
コードに関する情報がさらに必要な場合は、喜んで提供します。いつものように、これは課題のためなので、正しい方向に進むのに役立つヒントのみを求めています. 見てくれて助けてくれたみんなに感謝します!