检查哪些指针未在C中释放的方法

אבר*_*ובו 2 c malloc free pointers

我的代码已经用C语言编写了,我的内存泄漏错误.我在许多地方使用malloc和realloc,有没有办法检查哪些指针没有被释放?有没有报道可以指出我正确的方向?

此代码涉及指针数组,其中包含指向结构的指针和链接结构列表.代码中还有一些其他动态分配.

这是声明:

user **arrMen = NULL;
int menSize = 5;
womanUser *womHead = NULL;
Run Code Online (Sandbox Code Playgroud)

这就是我调用函数的方式:

freeAll(arrMen, womHead, &menSize);
Run Code Online (Sandbox Code Playgroud)

这就是我释放数组的方式:

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);
}
Run Code Online (Sandbox Code Playgroud)

该程序正在运行并按预期运行,但它正在遭受内存泄漏,我只是找不到我做错了什么,或者指针我不是免费的.

Cli*_*ord 5

诸如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);
Run Code Online (Sandbox Code Playgroud)

请注意,释放空指针是安全的,因此每次检查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 ;
Run Code Online (Sandbox Code Playgroud)