我想释放列表,但我认为我做错了,因为即使删除后我也有可访问的内存块。
typedef struct TEmployee
{
struct TEmployee * m_Next;
struct TEmployee * m_Bak;//random pointer
char * m_Name;
} TEMPLOYEE;
void freeList (TEMPLOYEE * src ) {
while ( src ) {
TEmployee * tmp = src ;
free(src->m_Name);
src = src -> m_Next ;
free ( tmp ) ;
}
}
假设您使用指向列表头部的指针调用freeList
,则会正确释放列表。
如果src
不一定指向列表中的第一个元素(但是指向列表中的随机元素),则可以使用m_Back
遍历回列表中的第一个元素,然后运行循环以释放它。
关于你的观察(“我有可达的内存块。”):
你认为你有可达内存块的原因是因为释放分配的内存不一定会改变内存内容本身;意思是,你在分配时存储在列表中的任何数据,在你释放内存之后仍然可以存在(当然你不能依赖它)。
如果(并且仅当)使用指向列表中第一个元素的指针调用它,则函数是正确的。
如果希望函数在使用指向列表中任意元素的指针调用时释放整个列表,则可以执行以下操作:
void freeList (TEMPLOYEE * src )
{
if (src)
{
TEmployee* tmp1;
// Free elements after src
tmp1 = src->m_Next;
while (tmp1)
{
TEmployee* tmp2=tmp1;
free(tmp1->m_Name);
tmp1 = tmp1->m_Next;
free(tmp2);
}
// Free elements before src
tmp1 = src->m_Bak;
while (tmp1)
{
TEmployee* tmp2=tmp1;
free(tmp1->m_Name);
tmp1 = tmp1->m_Bak;
free(tmp2);
}
// Free src
free(src->m_Name);
free(src);
}
}