C-内存泄漏(免费功能无效)



我正面临以下代码

的内存泄漏问题
static char **edits1(char *word)
{
    int next_idx;
    char **array = malloc(edits1_rows(word) * sizeof (char *));
    if (!array)
        return NULL;
    next_idx = deletion(word, array, 0);
    next_idx += transposition(word, array, next_idx);
    next_idx += alteration(word, array, next_idx);
    insertion(word, array, next_idx);
    return array;
}
static void array_cleanup(char **array, int rows) {
        int i;
        for (i = 0; i < rows; i++)
            free(array[i]);
}
static char *correct(char *word,int *count) {
        char **e1, **e2, *e1_word, *e2_word, *res_word = word;
        int e1_rows, e2_rows,max_size;
        e1_rows = edits1_rows(word);
        if (e1_rows) {
            e1 = edits1(word);
        *count=(*count)*300;
            e1_word = max(e1, e1_rows,*count);
            if (e1_word) {
                array_cleanup(e1, e1_rows);
                        free(e1);
                return e1_word;
            }
        }
    *count=(*count)/300;
    if((*count>5000)||(strlen(word)<=4))
        return res_word;
        e2 = known_edits2(e1, e1_rows, &e2_rows);
        if (e2_rows) {
        *count=(*count)*3000;
            e2_word = max(e2, e2_rows,*count);
            if (e2_word)
                    res_word = e2_word;
        }
        array_cleanup(e1, e1_rows);
        array_cleanup(e2, e2_rows);
        free(e1);
        free(e2);
        return res_word;
}

我不知道为什么free()不起作用。我称此功能在线程中"正确",多个线程正在同时运行。我正在使用UbuntuOS。

您不显示您分配实际数组的位置,您只需显示您分配指针数组的位置即可。因此,您很有可能在未显示的代码中其他地方泄漏。

此外,Array_Cleanup泄漏,因为它仅删除您不显示您分配位置的那些数组。它不会删除指针本身的数组。该功能的最后一行应该是free(array);

您的主要问题是您正在使用晦涩的分配算法。相反,分配真正的动态2D数组。

基于在评论中挖掘更多信息的答案。

大多数Malloc实现通常不会将内存返回操作系统,而是将其保留在将来呼叫的Malloc。之所以这样做,是因为将内存返回操作系统会对性能产生很大影响。

此外,如果您具有某些分配模式,则Malloc保留的内存可能不容易通过对Malloc的未来呼叫重复使用。这称为内存碎片,是设计记忆分配器的大型研究。

任何HTOP/TOP/PS报告的内容都不是您当前使用Malloc在程序中分配了多少内存,而是所有库所做的所有分配,它们的储备等,这些分配可能比您分配的更多的。

如果您想对要泄漏多少内存进行准确的评估,则需要使用诸如Valgrind之类的工具,或者查看您使用的Malloc是否使用诊断工具来帮助您。

相关内容

  • 没有找到相关文章

最新更新