2016-07-12 10 views
-1

必要なすべてのメモリを割り当て、データを読み込み、それに応じてリンクリストを作成する関数を作成する必要があります。 A = malloc(sizeof(Order))でメモリリークが発生しました。それはうまく動作しますが、私にメモリリークを与えます。誰も助けることができますか?どのように私はこのメモリリークをcで修正するのですか

typedef struct o_ 
{ 
    int ID; //the order number 
    int daysInQueue; //the number of days old the order is 
    struct o_* nextOrder; //to the next order in the list 
} Order; 


Order** importLists(char* filename) 
{ 
    FILE *fptr = fopen(filename,"r"); 
    Order ** b = malloc(sizeof(Order*)*4); 

    int i; 
    for (i=0; i< 4; i++) 
    { 
     b[i]=NULL; 
    } 
    Order* A; 
    while (A != NULL) 
    { 
     A = malloc(sizeof(Order)); 
     fscanf(fptr,"%d%d%d", &A ->ID, &A -> daysInQueue, &i); 
     if (feof(fptr)) 
     { 
      break; 
     } 
     A-> nextOrder = b[i]; 
     b[i]=A; 

    } 
    fclose(fptr); 

    return b; 
} 
+1

問題を解決する方法を知りたい場合は、完全なコードを投稿する必要があります。 –

+0

「Order * A; while(A!= NULL) 'はかなり疑わしいです。宣言されたときに' A'が 'NULL'である可能性が非常に高いからです。代わりに 'do'-'while'ループを使うか、無限ループ(' while(TRUE) ')と' break'を使います。ありがとう。 –

+0

ありがとう。私はそのようにして32バイトを取り除きました。そして1つのノードメモリリークはまだ16バイト残っています。 –

答えて

1

あなたがインスタントしたときにAにメモリを割り当てる必要があります。 malloc(...)

Order * A = (Order *)malloc(sizeof(Order));

(Order *) malloc関数がvoid *型を返すので、注文*を型にキャストです。あなたのwhileループでは

あなたは無期限にメモリを割り当てるしている(しばらくA!= NULL)、あなたがメモリリークを得た理由です。

ヒント(私はここでそれを説明するのに適切な場所ではないと思うので):malloc()とfree()関数の詳細を読む必要があります。 Order **bの宣言を変更したり、あなたのアルゴリズムの一部を再考する必要があるかもしれません(私はそれをテストしませんでした、ごめんなさいx))。

関連する問題