首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

局部变量跟指针混淆的一段内存泄露

2012-11-01 
局部变量和指针混淆的一段内存泄露class CListNode{public:CListNode()CListNode(int i)int m_DataCLis

局部变量和指针混淆的一段内存泄露

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的非指针变量给释放掉了。
所以要注意这样变量和指针混淆的情况

热点排行