gpt4 book ai didi

C++ 析构函数过早地删除东西(对象、指针?)

转载 作者:行者123 更新时间:2023-11-28 07:14:56 26 4
gpt4 key购买 nike

我有一个创建节点并将它们插入双向链表的任务。其中一项规范是包含一个析构函数。出于某种原因,当我在 main 中调用 addSortedList() 时,我的析构函数似乎正在删除对象或指针或两者。如果我取出析构函数,程序运行得很好,当调用 addSortedList() 时程序崩溃。今天我什至花了一些时间和我的导师在一起,他说我的析构函数看起来很好,但无法找出导致问题的原因。谁能向我解释为什么会这样?

#include <iostream>

using namespace std;

template <typename T>
class DoublyLinkedList;

template <typename T>
class Node
{
friend class DoublyLinkedList<T>;

public:
Node();
Node(const T& data, Node<T> *next, Node<T> *prev);

private:
T data;
Node<T> *next;
Node<T> *prev;
}; // end class Node

//*******************************************************************

// Create a header node for an empty linked list.

template <typename T>
Node<T>::Node()
{
next = this;
prev = this;
}

//*******************************************************************

// Create a regular node to be inserted into a linked list

template <typename T>
Node<T>::Node(const T& data, Node<T> *next, Node<T> *prev)
{
this->data = data;
this->next = next;
this->prev = prev;
}

//*******************************************************************

template <typename T>
class DoublyLinkedList
{
public:
DoublyLinkedList();
DoublyLinkedList(const T arr[], int arrSize);
~DoublyLinkedList();

void insert(Node<T> *insertionPoint, const T& data);
void display();
DoublyLinkedList<T> addSortedList(const DoublyLinkedList<T>& list2);

private:
Node<T> *header; // pointer to header node (header points to
// front and back of list)
int size; // number of data nodes in list
}; // end class DoublyLinkedList

//*******************************************************************

// Default constructor creates only a header node

template <typename T>
DoublyLinkedList<T>::DoublyLinkedList()
{
header = new Node<T>();
size = 0;
} // end constructor

//*******************************************************************

// Constructor takes in array and array size and creates a doubly
// linked list with a header node.

template <typename T>
DoublyLinkedList<T>::DoublyLinkedList(const T arr[], int arrSize)
{
header = new Node<T>();
size = arrSize;

for (int i = size - 1; i > -1; i--)
{
insert(header->next, arr[i]);
}
} // end constructor

//*******************************************************************

// Destructor to delete nodes after use.

template <typename T>
DoublyLinkedList<T>::~DoublyLinkedList()
{
Node<T> *oldFrontPointer; // pointer to node to be deleted
Node<T> *newFrontPointer; // pointer to next node to be deleted

oldFrontPointer = header->next;

while (oldFrontPointer->next != header)
{
newFrontPointer = oldFrontPointer->next;
delete oldFrontPointer;
oldFrontPointer = newFrontPointer;
}
delete header;
} // end destructor


//*******************************************************************

// This function inserts a new node into a list

template <typename T>
void DoublyLinkedList<T>::insert(Node<T> *insertionPoint, const T& data)
{
Node<T> *prevNodePtr; // pointer to node that precedes insertionpoint
Node<T> *newNodePtr; // pointer to new node

prevNodePtr = insertionPoint->prev;

newNodePtr = new Node<T>(data, insertionPoint, prevNodePtr);
size++;

insertionPoint->prev = prevNodePtr->next = newNodePtr;
} // end insert

//*******************************************************************

// This function prints the node data from a list

template <typename T>
void DoublyLinkedList<T>::display()
{
Node<T> *currentNodePtr = header->next;

if (size == 0)
{
cout << "Empty linked list.";
}
else
{
while (currentNodePtr != header)
{
cout << currentNodePtr->data << " ";
currentNodePtr = currentNodePtr->next;
}
}
cout << "\n";
} // end display

//*******************************************************************

// This function merges the parameter list into the calling object
// list in sorted order assuming both lists are presorted.

template <typename T>
DoublyLinkedList<T> DoublyLinkedList<T>::
addSortedList(const DoublyLinkedList<T>& list2)
{
Node<T> *list1Pointer = this->header->next;
Node<T> *list2Pointer = list2.header->next;

while (list1Pointer != this->header && list2Pointer->next != list2.header)
{
// insert list 2 nodes if they are smaller than list 1 current node

if (list1Pointer->data > list2Pointer->data)
{
insert(list1Pointer, list2Pointer->data);
list2Pointer = list2Pointer->next;
}

// move list 1 pointer if list 1 current node is smaller than
// list 2 current node

else if (list1Pointer->data < list2Pointer->data)
{
list1Pointer = list1Pointer->next;
}

// insert list 2 nodes that are smaller than list 1 current node

else if (list1Pointer->next == this->header)
{
insert(list1Pointer, list2Pointer->data);
list2Pointer = list2Pointer->next;
}
}// end while

// insert last list 2 nodes that are larger than last node in
// list 1 at the end of the list

while (list1Pointer->next == this->header && list2Pointer != list2.header)
{
list1Pointer = list1Pointer->next;
insert(list1Pointer, list2Pointer->data);
list2Pointer = list2Pointer->next;
}
return *this;
} // end addSortedList

int main()
{
int arrA[] = {20,80,100};
int arrB[] = {10,30,60,100,110};
int arrASize = sizeof(arrA)/sizeof(int);
int arrBSize = sizeof(arrB)/sizeof(int);

DoublyLinkedList<int> listA(arrA, arrASize);
DoublyLinkedList<int> listB(arrB, arrBSize);
DoublyLinkedList<int> listC;

listC.display();
listA.display();
listB.display(); //extra
listA.addSortedList(listB);
listA.display();
listB.display();
} // end main

最佳答案

您正在从 addSortedList 返回一个值,因此您的意图显然是返回对 this 的引用。返回的复制值然后与原始对象共享内部列表指针,并立即用它自己的析构函数删除它。

替换这个:

template <typename T>
DoublyLinkedList<T> DoublyLinkedList<T>::
addSortedList(const DoublyLinkedList<T>& list2)

用这个:

template <typename T>
DoublyLinkedList<T> &DoublyLinkedList<T>::
addSortedList(const DoublyLinkedList<T>& list2)

关于C++ 析构函数过早地删除东西(对象、指针?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com