Оператор присвоения для двусвязного списка
Пытаюсь перегрузить оператор присваивания для двухсвязного списка. При запуске выдаёт ошибку:"Вызвано исключение: нарушение доступа для чтения.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 два раза, так каждый указатель упомянут в обоих списках.
Это самая главная проблема, но не единственная.