Я получаю ошибку нарушения доступа для чтения, когда определенный Связанный список в моей программе пытается вызвать деструктор.Я предполагаю, что он пытается уничтожить нулевой список, но мой деструктор проверил это, и это вызывает нарушение только при удалении.
Источник ошибки
bool WaitOrders::loadOrderData()
{
bool opened;
int count, i = 0;
ifstream fin(mOrderFilename);
if (fin.is_open())
{
fin >> count;
fin.ignore();
while (!fin.eof() && i < count)
{
Order order;
fin >> order;
orders.insert(order); //<== insert function
i++;
} // <== error happens here because of the Order object's linked list's destructor
fin.close();
opened = true;
}
else
{
opened = false;
}
return opened;
}
Для большего контекста, здесь класс "Order" с только соответствующей информацией
class Order
{
private:
const double TAX = 0.11;
bool mStatus;
int mOrderNum;
double mFinalTotal, mSubTotal;
Customer mCustomer;
Table mTable;
LL<Item> orderedItems;
public:
// Constructors/Destructors
Order();
Order(int orderNum);
Order(int orderNum, Table table);
// Overloads
void operator=(const Order& rhs);
bool operator==(const Order& rhs);
// Friend Functions
friend std::ifstream& operator>>(std::ifstream& input, Order& obj);
friend std::ostream& operator<<(std::ostream& output, Order& obj);
friend std::ofstream& operator<<(std::ofstream& output, Order& obj);
};
Как видите, он имеет«LL» - класс шаблонов связанного списка, который я создал.Это Связанный список или, по крайней мере, соответствующие функции:
#include <iostream>
#include <fstream>
#include <string>
template <typename T>
class LL
{
struct Node
{
T mData;
Node *mNext;
Node();
Node(T data);
};
private:
Node *mHead, *mTail;
int mCount;
public:
// Constructors/Destructors
LL();
~LL();
// Functions
void clear();
bool insert(T data);
// Overloads
void operator=(const LL& rhs);
};
// Constructors/Destructors
template <typename T> LL<T>::Node::Node()
{
mData;
mNext = NULL;
}
template <typename T> LL<T>::Node::Node(T data)
{
mData = data;
mNext = NULL;
}
template <typename T> LL<T>::LL()
{
mCount = 0;
mHead = NULL;
mTail = NULL;
}
template <typename T> LL<T>::~LL()
{
clear();
}
// Functions
template <typename T> void LL<T>::clear()
{
Node *tmp;
tmp = mHead;
while (mHead != NULL)
{
mHead = mHead->mNext;
tmp->mNext = NULL;
delete tmp; // <== THE EXACT LINE THAT CAUSES THE ERROR
tmp = mHead;
}
mTail = NULL;
}
template <typename T> bool LL<T>::insert(T data)
{
Node* newNode;
newNode = new Node;
if (newNode == NULL)
{
return false;
}
newNode->mData = data;
if (mHead == NULL)
{
mHead = newNode;
}
else
{
mTail->mNext = newNode;
}
mTail = newNode;
mCount++;
return true;
}
// Overloads
template <typename T> void LL<T>::operator=(const LL& rhs)
{
Node* tmp;
tmp = rhs.mHead;
if (rhs.mHead != NULL)
{
while (tmp != NULL)
{
insert(tmp->mData);
tmp = tmp->mNext;
}
}
}
Итак, стоит заметить, что моя перегрузка оператора для "=" используется для функции вставки.Поскольку это два объекта Order, и поскольку объекты Order имеют Связанный список внутри них, я думаю, что это может быть проблемой, поскольку ни один из других типов объектов, которые я использовал в этом шаблоне Связанного списка, не сработал, потому что ни одиниз них сами имеют объект Linked List.Только мой класс Order.
Используется перегрузка оператора класса Order:
void Order::operator=(const Order& rhs)
{
mOrderNum = rhs.mOrderNum;
mStatus = rhs.mStatus;
mSubTotal = rhs.mSubTotal;
mFinalTotal = rhs.mFinalTotal;
mCustomer = rhs.mCustomer;
mTable = rhs.mTable;
orderedItems = rhs.orderedItems; // <== The linked lists
}
В последней строке я затем вызываю перегрузку оператора "=" в моем связанном спискеэто «передает» все данные с правой стороны влево.Вероятно, в этом и заключается проблема.
Итак, наконец, когда вызывается функция clear () из деструктора Linked List, строка delete tmp является точной строкой, в которой происходит ошибка, как я указываю.out.
Я знаю, что это очень окольный путь, но я прохожу все этапы отладки, которые я прошел, чтобы все поняли, откуда я.Пожалуйста, помогите мне.Спасибо!
РЕДАКТИРОВАТЬ: Я исправил это !!!!
template <typename T> bool LL<T>::insert(T data)
Пришлось изменить это на:
template <typename T> bool LL<T>::insert(T& data)
Это было все,Я чувствую себя глупо.