我想释放列表,但我认为我做错了,因为即使删除后我也有可访问的内存块。
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 ) ;
}
}
答案 0 :(得分:1)
假设您使用指向列表头部的指针调用freeList
,您的列表将被正确释放。
如果src
不一定指向列表中的第一个元素(但是指向列表中的随机元素),则可以使用m_Back
遍历回列表中的第一个元素,然后运行你的循环以释放它。
关于你的观察(“我有可达的内存块。”):
您认为可以访问内存块的原因是因为释放分配的内存并不一定会改变内存内容本身;意思是,你在分配时存储在列表中的任何数据,在你释放内存之后仍然可以存在(当然你不能依赖它)。
答案 1 :(得分:0)
如果(且仅当)使用指向列表中第一个元素的指针调用它,则函数是正确的。
如果你想要一个函数在使用指向列表中任意元素的指针调用时释放整个列表,你可以这样做:
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);
}
}