单链表内存泄露有关问题

单链表内存泄露问题
C/C++ code

#include <iostream>
#include <assert.h>
#include <stdlib.h>
#include <crtdbg.h>
using namespace std;

template<typename T>class CList;
template<typename T>
class CNode
{
public:
    CNode(){m_pNext = NULL;} //默认构造函数
    CNode(const T &data){m_pNext = NULL; m_data = data;    }//赋值
    ~CNode(){}
    friend class CList;
private:
    void AddAfter(T *node);//在该节点后面插入一个节点
    void DelAfter(T *node);//删除该节点后面的一个节点
    T m_data;
    CNode<T> * m_pNext;
public:
    T GetData(){return m_data;}
    void SetData(T data){m_data = data;}
};

//CList-----------------------------
template<typename T>
class CList
{
private:
    CNode<T>    *head;
public:
    CList();
    CList(CNode<T> &node);
    ~CList();
    void AddNode(CNode<T> *node);//在最后面添加一个新的节点.
    void AddNodeAt(CNode<T> *node, int n);//把node插入到索引为n的节点
    CNode<T>* DelNodeAt(int n);//删除第n个节点,并返回
    void DisplayAllNode();//显示所有的节点数据
};

void main()
{

    CList<int> myList;
    int i;
    for (i = 0; i < 10; i++)
    {
        myList.AddNode(new CNode<int>(i));
    }
    myList.DisplayAllNode();
    myList.AddNodeAt(new CNode<int>(100),6);
    myList.DisplayAllNode();

//     CNode<int>* abc = new CNode<int>(3333);
 //    delete abc;
    _CrtDumpMemoryLeaks();
}

//默认构造函数
template<typename T>
CList<T>::CList()
{
    head = new CNode<T>();
}

//析构函数
template<typename T>
CList<T>::~CList()
{
    if(head != NULL)
    {
        CNode<T>* p = head;
        CNode<T>* q = NULL;
        //delete head;
        while (p != NULL)
        {
            q = p;
            p = p->m_pNext;
            delete q;
            q = NULL;
        }
    }
}

//通过节点来初始化一个链表
template<typename T>
CList<T>::CList(CNode<T> &node)
{
    head = new CNode<T>();
    head->m_pNext = &node;
}

//在末尾插入
template<typename T>
void CList<T>::AddNode(CNode<T> *node)
{
    //assert(node != NULL);
    CNode<T> *temp = head;
    while (temp->m_pNext != NULL)
    {
        temp = temp->m_pNext;
    }
    temp->m_pNext = node;
}

//在指定节点插入
template<typename T>
void CList<T>::AddNodeAt(CNode<T> *node, int n)
{
    //assert(node != NULL || n > 0);
    CNode<T> *temp = head;
    CNode<T> *nextNext;
    int i = 0;
    while (i != n && temp != NULL)
    {
        temp = temp->m_pNext;
        i++;
    }//next指向的是n的前一个节点,head的索引可以认为是-1.
    if (i == n)
    {
        nextNext = temp->m_pNext;
        temp->m_pNext = node;
        node->m_pNext=nextNext;
    }
}

//输出所有的节点内容
template<typename T>
void CList<T>::DisplayAllNode()
{
    //输出内容, 头节点要跳过, 因为头节点没有内容
    CNode<T> *temp = head->m_pNext;
    cout<<"输入所有的数据"<<endl;

    while (temp != NULL)
    {
        cout<<"temp->GetData(): "<<temp->GetData()<<endl;
        temp = temp->m_pNext;
    }
}

//删除第n个节点, 并返回
template<typename T>
CNode<T>* CList<T>::DelNodeAt(int n)
{
    //assert( n > 0);
    CNode<T> *temp = head;
    CNode<T> *nextNext;
    int i = 0;
    while (i != n && temp != NULL)
    {
        temp = temp->m_pNext;
        i++;
    }//next指向的是n的前一个节点,head的索引可以认为是-1.
    if (i == n)
    {
        
        //temp->m_pNext 
    }
    return NULL;
}


调试的时候出现:
Detected memory leaks!
Dumping objects ->
{79} normal block at 0x00383178, 8 bytes long.
 Data: <d p 8 > 64 00 00 00 70 14 38 00 
{65} normal block at 0x00382F28, 8 bytes long.
 Data: < > 09 00 00 00 00 00 00 00 
{64} normal block at 0x00382EE0, 8 bytes long.
 Data: < (/8 > 08 00 00 00 28 2F 38 00 
{63} normal block at 0x00382E98, 8 bytes long.