リスト作成の際の注意
リスト作成して、ノードを挿入したい。
#includeusing namespace std; typedef struct _list { int data; struct _list *next; }MyList; class Node { public: Node(); ~Node(); private: MyList* m_head; public: void Insert(int num); void Disp(); }; Node::Node() { m_head = new MyList; m_head->data = -1; m_head->next = NULL; } Node::~Node() { delete m_head; } void Node::Insert(int num) { MyList* plus = new MyList; plus->data = num; plus->next = m_head->next; m_head->next = plus; } void Node::Disp() { for(MyList* node = m_head->next; node != NULL; node = node->next) { cout << node->data << endl; } putchar('\n'); } int main() { Node my; my.Insert(1); my.Insert(2); my.Insert(3); my.Disp(); }
見た目うまくいくけど、赤字が非常にまずくて、deleteしていない。
ようするに、全て終わった時にdeleteしてくれればよい
classのスコープは{から}までなので、}で、自動的にデストラクタが呼ばれる。
だから、デストラクタで今まで作ったノードをすべて消去すればよい。
デストラクタ部分
Node::~Node() { AllClear(); } void Node::AllClear() { MyList* p; for(MyList* node = m_head; node != NULL; ) { p = node; node = node->next; delete p; } }
かなりまよったが、これで。nodeが2個あって、m_headのアドレスが、300、、その先が350、、その先が400とする。
p = 300 node = 350 delete 300; p = 350 node = 400 delete 350; p = 400 node = NULL delete 400; node = NULL break;
みたいになって、全消しできる。