`

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

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

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics