Cのリンクリストからの無料のメモリ -- c フィールド と struct フィールド と memory-leaks フィールド と free フィールド 関連 問題

Free memory from linked list in C












0
vote

問題

日本語

リンクされたリストにロードされたファイルの割り当てられたメモリを解放しようとしていましたが、ノードを解放することができましたが、ファイルの値のコピーの割り当てられたメモリを解放する方法を理解できません。私はそのようなものを試しました:

<事前> <コード> void FreeString(struct node * newNode) { for (int i = 0; i < 5; i++) { free(newNode->string); } }

しかしコンパイラはセグメンテーション断層でクラッシュし、valgrindはまだメモリリークを指摘します。

誰かが私が間違っていることを私に言うことができるなら、私を正しい方向に指しているのであれば、理解されるでしょう。

フルコード:

構造体:

<事前> <コード> typedef struct node { char *string; struct node *next; }node;

//主な機能ここで...

<事前> <コード> void Push(struct node **RefHead, char *word) { struct node *newNode = NULL; newNode = (struct node *)malloc(sizeof(node)); newNode->string = (char*)malloc(strlen(word) + 1); // can't free this part here strcpy(newNode->string, word); newNode->next = *RefHead; *RefHead = newNode; }

ファイルのメモリへのロード:

<事前> <コード> void FileToNode() { struct node *head = NULL, *current = NULL; infile = fopen("file.txt", "r"); if (infile == NULL) { printf("Could not open file "); exit(1); } while (fgets(word, sizeof(word), infile)) { Push(&head, word); } fclose(infile); current = head; while(current) { printf("%s", current->string); current = current->next; } freeAll(head); }

自由機能:

<事前> <コード> void freeAll(struct node *head) { struct node *current = NULL; while ((current = head) != NULL) { head = head->next; free(current); } }
英語

I have been trying to free the allocated memory of a file loaded into a linked list, I have managed to free the nodes, but I can't figure out how to free the allocated memory of the file's values copies.

I have tried something like that:

void FreeString(struct node * newNode) {     for (int i = 0; i < 5; i++)     {            free(newNode->string);     } } 

but the compiler would crash with a segmentation fault, and valgrind would still point out to memory leaks.

it would be appreciated if anyone can tell me what am I doing wrong, and point me to the right direction.

Full code:

The struct:

typedef struct node {     char *string;     struct node *next; }node; 

// main function here...

void Push(struct node **RefHead, char *word) {     struct node *newNode = NULL;      newNode = (struct node *)malloc(sizeof(node));      newNode->string = (char*)malloc(strlen(word) + 1); // can't free this part here     strcpy(newNode->string, word);     newNode->next = *RefHead;     *RefHead = newNode;  } 

Loading the file into memory:

void FileToNode() {     struct node *head = NULL, *current = NULL;      infile = fopen("file.txt", "r");     if (infile == NULL)     {         printf("Could not open file ");         exit(1);     }      while (fgets(word, sizeof(word), infile))     {         Push(&head, word);     }      fclose(infile);      current = head;      while(current)     {         printf("%s", current->string);         current = current->next;     }       freeAll(head);  } 

The Free function:

void freeAll(struct node *head) {     struct node *current = NULL;      while ((current = head) != NULL)     {         head = head->next;         free(current);     } } 
</div
           
       
       

回答リスト

1
 
vote
vote
ベストアンサー
 

何かが足りない?何が問題なのか:

<事前> <コード> void freeAll(struct node *head) { struct node *current = NULL; while ((current = head) != NULL) { head = head->next; free(current->string); free(current); } }
 

Am I missing something? What's wrong with:

void freeAll(struct node *head) {     struct node *current = NULL;      while ((current = head) != NULL)     {         head = head->next;         free(current->string);         free(current);     } } 
</div
 
 
     
     
0
 
vote

問題ではありませんが、おそらく置き換える必要があります。

<事前> <コード> newNode->string = (char*)malloc(strlen(word) + 1); // can't free this part here strcpy(newNode->string, word);

<事前> <コード> newNode->string = strdup (word);

問題はこれです:

<事前> <コード> void FreeString(struct node * newNode) { for (int i = 0; i < 5; i++) { free(newNode->string); } }

free newNode->string を呼び出すと、割り当てられたオブジェクトを指していません(解放されたばかりです)。そのため、 free に渡すことはできません。

 

It's not the problem, but you should probably replace:

newNode->string = (char*)malloc(strlen(word) + 1); // can't free this part here strcpy(newNode->string, word); 

with:

newNode->string = strdup (word); 

The problem is this:

void FreeString(struct node * newNode) {     for (int i = 0; i < 5; i++)     {            free(newNode->string);     } } 

Once you call free, newNode->string no longer points to an allocated object (because you just freed it). So you can't pass it to free again.

</div
 
 
   
   

関連する質問

8  メモリ内のポインターのスペースを無料で行う方法は?  ( How to free pointers space in memory ) 
私はC内のポインタについて質問をしています。各ポインタはメモリ内(アドレス)に4バイトを持ちます。 Malloc()を呼び出すと、メモリを割り当ててそれがポインタにアドレスを配置するだけで、free()もポインタが指しているメモリのみを解放します。しかし、私が...

-2  どのように私は構造体内でchar *を解放できますか?  ( How can i free a char within a struct ) 
<事前> <コード> 1| typedef struct container{ 2| char* abc; 3| }container; 4| 5| 6| int main(void){ 7| 8| container* xyz...

0  %resetコマンドはすべてのJupyterノートブックの在庫変更された変数をクリアしますか?  ( Does reset command clear all the jupyter notebooks stocked variables ) 
%reset commandは、すべてのJupyterノートブックの在庫をクリアするか、現在のノートブックに在庫されているものだけをクリアしますか? 私はすべてのメモリとすべてを解放したいが、現在のJupyterノートブックファイル内で書かれたコードと残...

2  VCとWin32でテキスト間祭り音声フリーライブラリをコンパイルする方法  ( How to compile text to speech festival voice free library on win32 with vc ) 
ロボットではない人間のvoidで私のアプリケーションにテキストを埋め込む必要がある 私はFestival Libについて見つけました。 IMはWindowsに取り組んでいるかどうかわからない? 誰かがSygwin なしでWindowsでlibをコンパイルするこ...

-1  同じタイプのメンバーを持つ構造体上で無料で使用する  ( Using free on a struct that has a member of the same type ) 
私はNoob学習Cです、私は単純オブジェクトシステムを調整しようとしています。 。 私はこのような構造を持っています: <事前> <コード> struct Room { Object proto; Monster* bad_guy; s...

1  Cで構造体を使う方法?  ( How to use struct in c ) 
これは私のコードです: <事前> <コード> struct Point { int i; int j; }; int main(int argc, char *argv[]) { int n = atoi(argv[1]); ...

0  function free()がベクトルからメモリを割り当てません。  ( Function free doesnt de allocate memory from a vector ) 
この質問はすでにここで回答を持っています free() (5回答) 閉じられた 1年前>。 の後に同じ...

5  STRTOKとメモリリーク  ( Strtok and memory leaks ) 
strtok()を使用して単純なURLパーサーを書きました。これがコードです <事前> <コード> #include <stdio.h> #include <stdlib.h> typedef struct { char *protocol; ...

6  C.の二重リンクリストを無料で  ( Free a doubly linked list in c ) 
私はCに二重リンクされたリストを持っています、そして私がそれを解放することについてどのように行くべきかに関して混乱しています。私は私が各ノードの解放リストを通過しなければならないことを理解しています。混乱があるところが、私のノードのそれぞれが他のデータへのポイ...

3  プログラムを終了せずに動的に割り当てられたメモリをOSに戻す  ( Returning dynamically allocated memory back to os without terminating the progra ) 
私は大きなが限られたメモリを使っているプログラムに取り組んでいます。メモリは割り当てられ、異なるスレッド上の実行時間に解放されます。ただし、プログラムのメモリ使用量が指定された範囲内に残っていないことに気付いた。時間が経過するにつれてそれは増加するでしょう。次...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有