0

以下のコードでメモリリークの問題に直面しています

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()。この関数をスレッドで「正しい」と呼んでいます。複数のスレッドが同時に実行されています。Ubuntu OS を使用しています。

4

2 に答える 2

0

実際の配列を割り当てる場所を示すのではなく、ポインターの配列を割り当てる場所を示すだけです。したがって、表示されていないコードの他の場所にリークがある可能性は十分にあります。

さらに、array_cleanup は、割り当て場所を示さない配列のみを削除するため、リークします。ポインターの配列自体は削除されません。その関数の最終行はfree(array);.

あなたの主な問題は、あいまいな割り当てアルゴリズムを使用していることです。代わりに、真の動的 2D 配列を割り当てます

于 2012-10-25T07:59:04.150 に答える
0

コメントで詳細情報を掘り下げて回答します。

ほとんどの malloc 実装は通常、メモリをオペレーティング システムに返さず、今後 malloc を呼び出すために保持します。これは、メモリをオペレーティング システムに戻すと、パフォーマンスに大きな影響を与える可能性があるためです。

さらに、特定の割り当てパターンがある場合、malloc が保持するメモリは、今後 malloc を呼び出すときに簡単に再利用できない可能性があります。これはメモリ フラグメンテーションと呼ばれ、メモリ アロケータを設計するための大きな研究テーマです。

htop/top/ps が報告するものは、プログラム内で malloc を使用して現在割り当てられているメモリの量ではなく、すべてのライブラリが行ったさまざまな割り当て、それらの予約などであり、割り当てたよりもはるかに多くなる可能性があります。

リークしているメモリの量を正確に評価したい場合は、valgrind などのツールを使用するか、使用している malloc に診断ツールがあるかどうかを確認する必要があります。

于 2012-10-25T08:08:05.583 に答える