Оператор присвоения для двусвязного списка

Пытаюсь перегрузить оператор присваивания для двухсвязного списка. При запуске выдаёт ошибку:"Вызвано исключение: нарушение доступа для чтения.pThis->m_data-> было 0xDDDDDDDD." Подскажите пожалуйста, в чём ошибка и как её исправить?

Оператор присвоения

 List& List::operator=(const List& other)
{
    if (this != &other)
    {
        Node* pThis = Head.pNext; // указатель на текущий список
        Node* pOther = other.Head.pNext; //указатель на копируемый список

        if (m_size < other.m_size)// если размер текущего списка меньше копируемого
        {

            for (int i = 0; i < m_size; i++)
            {
                if (typeid(*pThis->m_data) == typeid(*pOther->m_data))// если типы данных одинаковые
                {
                    *pThis->m_data = *pOther->m_data; // присваеваем данные
                }
                else
                {
                    delete pThis->m_data; // удаляем данные
                    *pThis->m_data = *pOther->m_data->Make();
                }
                pOther = pOther->pNext; // переходим на седующий узел
                pThis = pThis->pNext;   // переходим на седующий узел
            }

            for (int i = m_size; i < other.m_size; i++) //добовляем элемент в конец
            {
                AddToTail(pOther->m_data);// добавляем узел
                pOther = pOther->pNext;
            }
        }
        else
        {
            for (int i = 0; i < other.m_size; i++)
            {
                if (typeid(*pThis->m_data) == typeid(*pOther->m_data))
                {
                   *pThis->m_data = *pOther->m_data;
                }
                else
                {
                    delete pThis->m_data;
                    *pThis->m_data = *pOther->m_data->Make();
                }
                pOther = pOther->pNext;
                pThis = pThis->pNext;
            }

            for (int i = other.m_size; i < m_size; i++)
            {
                delete Tail.pPrev;
            }

        }
        m_size = other.m_size;
    }
    return  *this;

}

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Скажем, присвоили вы один список другому и всё прошло успешно. Удаляем списки одни за другим. Они удаляют указатели mdata два раза, так каждый указатель упомянут в обоих списках.

Это самая главная проблема, но не единственная.

→ Ссылка