我为异或链表编写代码。我有一个函数,我得到一个指针,使用属性 C.link = A XOR B。这里是这个函数的代码
template <class T>
Node<T>* List<T>::get_next(Node<T>* curr, Node<T>* prev)
{
assert(curr != 0);
return (Node<T>*)((int)prev ^ (int)curr->np);
}
但最后得到一个分段错误。用 GDB 调试表明,这是因为return (Node<T>*)((int)prev ^ (int)curr->np);
变量中的行这样的值
p *prev
$6 = {data = 2, np = 0x60}
p *curr
$7 = {data = 12, np = 0x804c058}
在异或的最后
p ((int)prev ^ (int)curr->np)
$8 = 16
在我看来,没有有效的指针,因此它遵循分段错误。我该如何解决?谢谢
Тhe 问题解决了。问题出在赋值运算符中
template <class T>
List<T>& List<T>::operator=(const List& l)
{
if(this == &l)
{
return *this;
}
delete this->m_head;
delete this->m_tail;
this->m_size = l.m_size;
this->m_head = new Node<T>(l.m_head->data);
this->m_tail = new Node<T>(l.m_tail->data);
this->m_head = l.m_head;// problem here
this->m_tail = l.m_tail;// and here
return *this;
}
我删除了这两行,问题就消失了。
int main()
{
List<int> l;
l.insertAtBack(5);
l.insertAtBack(4);
l.insertAtBack(8);
l.insertAtBack(9);
l.insertAtBack(2);
l.insertAtBack(12);
List <int> i;
i = l;
i.insertAtBack(19);
l.insertAtBack(21);
i.traverse();
l.traverse();
if(i == l)
{
std::cout << "Objects is equal :)" << std::endl;
}
else
{
std::cout << "Objects is not equal :)" << std::endl;
}
return 0;
}
主程序称为赋值运算符,将旧对象的头部和尾部值分配给新对象。