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

本文详细解析了一个简单的C++链表实现——CList。通过分析CList的构造、插入和删除操作,揭示了在使用指针时需要注意的内存管理问题。特别是针对析构函数中的指针释放过程进行了深入探讨,帮助读者理解如何正确处理链表节点的内存分配与回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值