0

我为异或链表编写代码。我有一个函数,我得到一个指针,使用属性 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;
}

主程序称为赋值运算符,将旧对象的头部和尾部值分配给新对象。

4

1 回答 1

0
  • 使用intptr_t而不是int,如果你有它... int不一定大到足以容纳一个指针,特别是在 64 位系统上。在较旧的编译器中,size_t更有可能足够大。
  • 它看起来curr要么指向列表的最后一个元素,要么指向它之外的东西。(np那么大通常意味着它与空指针进行了异或运算,或者没有正确设置。)首先看看你是如何np设置它的;那里有些奇怪。
于 2013-06-04T14:49:30.877 回答