class CListNode
{
public:
CListNode();
CListNode(int i);
int m_Data;
CListNode *m_Next;
};
CListNode::CListNode():m_Data(0), m_Next(0)
{
}
CListNode::CListNode(int i):m_Data(i), m_Next(0)
{
}
class CList
{
public:
CList();
CList(int i);
CList(CList *pNew);
~CList();
int NextNode();
void _InsertAfter(int iNew);
void _DeleteAfter();
void _DeleteFront();
void _PrintData();
CListNode m_Head;
private:
CListNode *c_m_Head;
int m_iCount;
protected:
};
CList::CList()
{
m_Head.m_Next = NULL;
c_m_Head = &m_Head;
cout<<"1:"<<&m_Head<<endl;
}
CList::CList(int i)
{
_InsertAfter(i);
}
CList::~CList()
{
m_Head = *c_m_Head;
CListNode *p;
while( m_Head.m_Next!=NULL )
{
p = m_Head.m_Next;
m_Head = *(p->m_Next);
delete p;
}
}
void CList::_InsertAfter(int iNew)
{
CListNode *p= new CListNode(iNew);
p->m_Next = m_Head.m_Next;
m_Head.m_Next = p;
}
void CList::_DeleteFront()
{
}
void CList::_DeleteAfter()
{
CListNode *p;
p = m_Head.m_Next;
m_Head.m_Next = p->m_Next;
delete p;
}
void CList::_PrintData()
{
m_Head = *c_m_Head;
while( m_Head.m_Next!=NULL )
{
m_Head = *(m_Head.m_Next);
cout<<m_Head.m_Data<<endl;
}
}
int main()
{
CList *clist = new CList;
int i;
for(i=0; i<10; i++)
{
clist->_InsertAfter(i);
}
clist->_PrintData();
delete clist;
return 0;
}
先看析构函数和_PrintData()中的代码中的取地址可以说是一样的
可以发现,在clist->_PrintData();时,还可以顺利打出。
但是析构里连while都进不了.
跟踪m_Head地址发现是一样的。但是在分构里面m_Head.m_Next已经是NULL了
这里的原因是,delete时,先把clist的非指针变量给释放掉了。
所以要注意这样变量和指针混淆的情况