2016-12-18 8 views
-1

リスト構造と複数のノード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);です。

ご協力いただければ幸いです。さらなる明確化が必要な場合は、私はそれを説明するために最善を尽くします。

+0

tb-> tail->次にtb-> headを指していますか? –

答えて

1

ループを開始する前にtb->tailが指し示している場所はどこですか?

NULLの場合は、tb->tail->nextが間違っています。

NULLではなく、リスト内のノードを指している場合は、すべてのノードを解放するまでにまだ間違っています。

+0

tb-> tailはリストの最後です。 – Khellick

+0

ええ、それはあなたの問題だと思います。リスト全体を解放し、 'curr'がNULLのとき、' tb-> tail'は解放されたメモリを指しています。 – 599644

+0

しかし、時にはtb-> tailは、大きなリストのサブリストの終わりに過ぎません。そうであれば、 'tb-> tail-> next!= NULL'となります。 – Khellick

関連する問題