2017-03-18 3 views
1

私は、第1の原則に基づいてC++で順序付けされていないリンクリストを実装しています。私の(部分的に完全な今のところ)実装は次のとおりです。私のC++リンクリストインプリメンテーションでノード参照をデレファレンスすると、予期しない結果が発生する

#include <iostream> 

class Node { 
    int m_data; 
    Node *m_next; 

public: 
    Node(int data) 
    { 
     m_data = data; 
     m_next = nullptr; 
    } 

    int getData() { return m_data; } 
    void setData(int data) { m_data = data; } 
    Node* getNext() { return m_next; } 
    void setNext(Node *next) { m_next = next; } 
}; 

class UnorderedList { 
public: 
    Node *m_head; 

public: 
    UnorderedList() 
    { 
     m_head = nullptr; 
    } 

    bool isEmpty() { return m_head == nullptr; } 

    void appendToHead(int data) 
    { 
     Node temp = Node(data); 
     temp.setNext(m_head); 
     m_head = &temp; 
    } 

    void remove(int data); 
    bool search(int data); 
}; 

int main() 
{ 
    UnorderedList list1; 
    list1.appendToHead(32); 
    list1.appendToHead(47); 
    list1.appendToHead(90); 
    std::cout << list1.m_head->getData() << '\n'; 
    std::cout << list1.m_head->getNext()->getData() << '\n'; 
    return 0; 
} 

私は正しく「90」として、リストの先頭を印刷することができていますが、次の行(すなわちgetNextを() - >のgetData())が印刷されます大きな乱数(281314120)とみなされます。これの理由は何ですか?

+0

*自動保存期間*でオブジェクトのアドレスを保存しないでください。あなたは 'UnorderedList :: appendToHead'メソッドでそれを行い、未定義の振る舞いを呼び起こしました – WhiZTiM

答えて

0
void appendToHead(int data) 
{ 
    Node temp = Node(data); 
    temp.setNext(m_head); 
    m_head = &temp; 
} 

automatic storage durationでオブジェクトのアドレスを保存しないでください。 appendToHeadメソッドが完了すると、そのオブジェクト(この場合はtemp)が存在しなくなります。

これを行い、未定義の動作を呼び出しました。あなたはまた、さらにstd::unique_ptrの使用を探る、満足The Rule Of Five

ではなく生のポインタを検討すべきである

void appendToHead(int data) 
{ 
    Node* temp = new Node(data); 
    temp->setNext(m_head); 
    m_head = temp; 
} 

:あなたは、おそらくやってみたかったです。

+0

、ありがとう@WhiZTiM!私はupvotedしかし、私の評判が現在13であるので、それは表示されません:) –

+0

@AbhimanyuSahai、あなたは大歓迎です。心配する必要はありません。あなたの担当者が最終的にそこに着くときに表示されます。 :-)しかし、あなたの問題を解決すれば、回答を受け入れたものとしてマークすることができます。 – WhiZTiM