检查哪些指针未在 C 中释放的方法
Way to check which pointers were not freed in C
我的代码已经用 C 语言编写,但出现内存泄漏错误。
我在很多地方都使用 malloc 和 realloc,有没有办法检查哪些指针没有被释放?
是否有任何报告可以为我指明正确的方向?
此代码涉及包含指向结构的指针的指针数组和结构链表。代码中还有一些其他的动态分配。
这是声明:
user **arrMen = NULL;
int menSize = 5;
womanUser *womHead = NULL;
我是这样调用函数的:
freeAll(arrMen, womHead, &menSize);
这就是我释放数组的方式:
void freeAll(user **arrMen, womanUser *womHead,int *menSize)
{
womanUser *current = womHead;
womanUser *previous = current;
int i;
//free all pointers in woman list
while (current != NULL)
{
if (current->womData->name != NULL)
free(current->womData->name);
if (current->womData->lastName != NULL)
free(current->womData->lastName);
if (current->womData->age != NULL)
free(current->womData->age);
if (current->womData->userName != NULL)
free(current->womData->userName);
if (current->womData->pass != NULL)
free(current->womData->pass);
if (current->womData->desc != NULL)
free(current->womData->desc);
previous = current;
current = current->next;
free(previous);
}
//free all pointer in men array
for (i = 0; i < *menSize; i++)
{
if (arrMen[i]->name != NULL)
free(arrMen[i]->name);
if (arrMen[i]->lastName != NULL)
free(arrMen[i]->lastName);
if (arrMen[i]->age != NULL)
free(arrMen[i]->age);
if (arrMen[i]->userName != NULL)
free(arrMen[i]->userName);
if (arrMen[i]->pass != NULL)
free(arrMen[i]->pass);
if (arrMen[i]->desc!= NULL)
free(arrMen[i]->desc);
}
if (arrMen != NULL)
free(arrMen);
}
程序 运行 并按预期运行,但它存在内存泄漏问题,我就是找不到我做错了什么,或者我没有找到的指针在哪里免费。
诸如 Valgrind(在 Linux 上)之类的工具是泄漏检测和调试的最佳选择,仅次于直接的仔细编程 - 每次进行分配时,同时编写匹配的释放代码。我认为 VC++ 的最新版本中的调试器也会在终止时报告内存泄漏。
然而,在这种特定情况下,@jamesdlin 似乎已经发现了它。您在未先释放其元素的情况下释放 arrMen
:
for (i = 0; i < *menSize; i++)
{
free(arrMen[i]->name);
free(arrMen[i]->lastName);
free(arrMen[i]->age);
free(arrMen[i]->userName);
free(arrMen[i]->pass);
free(arrMen[i]->desc);
free( arrMen[i] ) ; // <<< Free the structure
// after its members
}
free(arrMen);
请注意,释放空指针是已定义且安全的,因此每次检查 NULL 都没有任何意义。你可能做的是将每个指针 设置为 NULL,这样如果以后有任何代码试图取消引用它,它至少会导致 运行 次错误。例如,您可能有:
for (i = 0; i < *menSize; i++)
{
free(arrMen[i]->name);
free(arrMen[i]->lastName);
free(arrMen[i]->age);
free(arrMen[i]->userName);
free(arrMen[i]->pass);
free(arrMen[i]->desc);
memset( arrMen[i], sizeof(*arrMen[i]), 0 ) ;
free( arrMen[i] ) ; // <<< Free the structure
// after its members
arrMen[i] = NULL ;
}
free(arrMen);
arrMen = NULL ;
我的代码已经用 C 语言编写,但出现内存泄漏错误。 我在很多地方都使用 malloc 和 realloc,有没有办法检查哪些指针没有被释放? 是否有任何报告可以为我指明正确的方向?
此代码涉及包含指向结构的指针的指针数组和结构链表。代码中还有一些其他的动态分配。
这是声明:
user **arrMen = NULL;
int menSize = 5;
womanUser *womHead = NULL;
我是这样调用函数的:
freeAll(arrMen, womHead, &menSize);
这就是我释放数组的方式:
void freeAll(user **arrMen, womanUser *womHead,int *menSize)
{
womanUser *current = womHead;
womanUser *previous = current;
int i;
//free all pointers in woman list
while (current != NULL)
{
if (current->womData->name != NULL)
free(current->womData->name);
if (current->womData->lastName != NULL)
free(current->womData->lastName);
if (current->womData->age != NULL)
free(current->womData->age);
if (current->womData->userName != NULL)
free(current->womData->userName);
if (current->womData->pass != NULL)
free(current->womData->pass);
if (current->womData->desc != NULL)
free(current->womData->desc);
previous = current;
current = current->next;
free(previous);
}
//free all pointer in men array
for (i = 0; i < *menSize; i++)
{
if (arrMen[i]->name != NULL)
free(arrMen[i]->name);
if (arrMen[i]->lastName != NULL)
free(arrMen[i]->lastName);
if (arrMen[i]->age != NULL)
free(arrMen[i]->age);
if (arrMen[i]->userName != NULL)
free(arrMen[i]->userName);
if (arrMen[i]->pass != NULL)
free(arrMen[i]->pass);
if (arrMen[i]->desc!= NULL)
free(arrMen[i]->desc);
}
if (arrMen != NULL)
free(arrMen);
}
程序 运行 并按预期运行,但它存在内存泄漏问题,我就是找不到我做错了什么,或者我没有找到的指针在哪里免费。
诸如 Valgrind(在 Linux 上)之类的工具是泄漏检测和调试的最佳选择,仅次于直接的仔细编程 - 每次进行分配时,同时编写匹配的释放代码。我认为 VC++ 的最新版本中的调试器也会在终止时报告内存泄漏。
然而,在这种特定情况下,@jamesdlin 似乎已经发现了它。您在未先释放其元素的情况下释放 arrMen
:
for (i = 0; i < *menSize; i++)
{
free(arrMen[i]->name);
free(arrMen[i]->lastName);
free(arrMen[i]->age);
free(arrMen[i]->userName);
free(arrMen[i]->pass);
free(arrMen[i]->desc);
free( arrMen[i] ) ; // <<< Free the structure
// after its members
}
free(arrMen);
请注意,释放空指针是已定义且安全的,因此每次检查 NULL 都没有任何意义。你可能做的是将每个指针 设置为 NULL,这样如果以后有任何代码试图取消引用它,它至少会导致 运行 次错误。例如,您可能有:
for (i = 0; i < *menSize; i++)
{
free(arrMen[i]->name);
free(arrMen[i]->lastName);
free(arrMen[i]->age);
free(arrMen[i]->userName);
free(arrMen[i]->pass);
free(arrMen[i]->desc);
memset( arrMen[i], sizeof(*arrMen[i]), 0 ) ;
free( arrMen[i] ) ; // <<< Free the structure
// after its members
arrMen[i] = NULL ;
}
free(arrMen);
arrMen = NULL ;