0

malloc されたオブジェクトを解放しようとすると、valgrind を実行すると、事態が悪化したことを暗示しているようです。たとえば、ここに私のコードがあります:

for(next_token = TKGetNextToken(tokenizer); next_token != NULL; next_token = TKGetNextToken(tokenizer))
        {
            ItemType* item = malloc(sizeof(ItemType));
            item->data = to_lower(next_token);
            item->fileName = filename;
            item->occ = 1;
            HM_Put(hm, item);
            free(next_token);
        }

さて、上記のコードでは、項目が malloc された行でバイトが確実に失われたことがわかります。ただし、free(next_token) の下に free(item) を追加すると、確実に失われたステートメントが残るだけでなく、ヒープ サマリーの前に大量の無効な読み取りが発生します。誰かが私に助けを提供できる場合、これを修正する方法について完全に途方に暮れています。ありがとう

4

2 に答える 2

0

next_tokenは文字列だと思いますが、それは新しい文字列を作成しませto_lowerん。つまり、解放されたメモリへnext_tokenitem->data静止ポイントを解放した後です。

于 2013-10-13T17:52:16.873 に答える
0

トークナイザーを閉じたItemType、何らかの方法でsを解放する必要があります。以前にそれらを解放すると、トークン化は解放されたメモリに読み込まれますが、これは非常にやりたくないことです。

あなたのフレームワークは、 に供給されたものを解放する何らかの方法を提供する必要があると思いますHM_Put。そうでない場合は、自分でこれを行う必要があります。

to_lower例 (これは、トークンとed トークンの間でどちらを保持するかを決定することで最適化できます):

typedef struct t_tofree {
    struct t_tofree *next;
    ItemType *item;
    char *token;   // Maybe superfluous if item->data points here...
};
t_tofree *toFree = NULL;

void mustFree(ItemType *item, char *token) {
    t_tofree *new = malloc(sizeof(t_tofree));
    new->next = toFree;
    new->item = item;
    new->token = token;
    toFree = new;
}

void freeAll() {
    while (toFree) {
        t_toFree *next = toFree->next;

        free(toFree->token); toFree->token = NULL;
        // The line below if token is *not* data and both were allocated.
        free(toFree->item->data; toFree->item->data = NULL;
        // Other cleanup on item?
        free(toFree->item); toFree->item = NULL;
        free(toFree); toFree = next;
    }
}
...

for(next_token = TKGetNextToken(tokenizer); next_token != NULL; next_token =     TKGetNextToken(tokenizer))
    {
        ItemType* item = malloc(sizeof(ItemType));
        item->data = to_lower(next_token);
        item->fileName = filename;
        item->occ = 1;
        HM_Put(hm, item);

        // Probably you can free next_token here, and only store item->data
        mustFree(item, next_token);
    }

 ...
 // Here you're REALLY REALLY sure you won't use tokens or items
 // (it's agreed that TKGetNextToken returns alloc'ed memory)
 freeAll();
于 2013-10-13T18:11:38.280 に答える