0

xor 連結リストのコードを書きます。プロパティ 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}

xorの終わりに

p ((int)prev ^ (int)curr->np)
$8 = 16

私の意見では、有効なポインターがないため、セグメンテーション違反に従います。どうすれば修正できますか?ありがとう

問題は解決されました。問題は代入演算子にありました

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;
}

これらの2行を削除すると、問題はなくなりました。

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よりもむしろを使用してください。特に 64 ビット システムでは、ポインターを保持するのに十分な大きさであるとは限りませんintint古いコンパイラでsize_tは、十分な大きさになる可能性が高くなります。
  • currリストの最後の要素、またはその外側の何かを指しているようです。(npこれほど巨大であるということは、通常、null ポインターで XOR されているか、適切に設定されていないことを意味します。)np最初に設定する方法を考えてみてください。そこに奇妙なものがあります。
于 2013-06-04T14:49:30.877 に答える