リスト作成の際の注意

リスト作成して、ノードを挿入したい。

#include 
using 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;

みたいになって、全消しできる。