リスト構造と複数のノードstuctsで構成されるリンクリストを解放しようとしています。各ノード構造体には文字列が添付されています。Valgrind:無効なCのリンクリストを解放するときのサイズ8の読み取り
私の頭の中で始まり、指定されたリストの末尾までサイクルすれば、各ノードとノードの文字列を解放します。すべての文字列とノードが解放された後、リスト自体を解放します。
私のプログラムでは、以前の別の関数で文字列のサイズをmallocingしているので、文字列を解放する必要があります。
My機能は次のとおりです。私は大きなリストにしてサブリストを解放したいとき
void releaseTB (TB tb){
if(tb != NULL){
if(tb->head != NULL){
Node curr = tb->head;
Node prev = NULL;
while(curr != NULL && curr != tb->tail->next){
prev = curr;
curr = curr->next;
free(prev->line);
free(prev);
}
}
free(tb);
}
}
whileループ内の条件curr != tb->tail->next
を扱っています。
それは全く関連性オフになっている場合、これらは私の構造体です:私のプログラムを実行しているとき、私は正しい出力を得る
typedef struct textbuffer *TB;
typedef struct node *Node;
struct textbuffer{
Node head;
Node tail;
};
struct node{
Node prev;
Node next;
char *line;
};
が、私はvalgrindの出力があるサイズ8の不正な読み取りを取得しています:
==7705== Memcheck, a memory error detector
==7705== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7705== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==7705== Command: ./dry5
==7705==
Original Tb:
1.1 abc
1.2 def
xxxxx
==7705== Invalid read of size 8
==7705== at 0x400ADC: releaseTB (textbuffer.c:124)
==7705== by 0x4013EF: deleteTB (textbuffer.c:355)
==7705== by 0x4007FA: main (dry5.c:14)
==7705== Address 0x51e0208 is 8 bytes inside a block of size 32 free'd
==7705== at 0x4C29E90: free (vg_replace_malloc.c:473)
==7705== by 0x400ACC: releaseTB (textbuffer.c:128)
==7705== by 0x4013EF: deleteTB (textbuffer.c:355)
==7705== by 0x4007FA: main (dry5.c:14)
==7705==
First and second line are deleted...
xxxxx
Released Tb
==7705==
==7705== HEAP SUMMARY:
==7705== in use at exit: 0 bytes in 0 blocks
==7705== total heap usage: 11 allocs, 11 frees, 219 bytes allocated
==7705==
==7705== All heap blocks were freed -- no leaks are possible
==7705==
==7705== For counts of detected and suppressed errors, rerun with: -v
==7705== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
:releaseTB (textbuffer.c:124)
はwhile(curr != NULL && curr != tb->tail->next){
と0x400ACC: releaseTB (textbuffer.c:128)
ではfree(prev);
です。
ご協力いただければ幸いです。さらなる明確化が必要な場合は、私はそれを説明するために最善を尽くします。
tb-> tail->次にtb-> headを指していますか? –