Деструктор связанного списка, вызывающий нарушение прав чтения - PullRequest
0 голосов
/ 15 апреля 2019

Я получаю ошибку нарушения доступа для чтения, когда определенный Связанный список в моей программе пытается вызвать деструктор.Я предполагаю, что он пытается уничтожить нулевой список, но мой деструктор проверил это, и это вызывает нарушение только при удалении.

Источник ошибки

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)

Это было все,Я чувствую себя глупо.

...