2016-09-01 9 views
0

私は、ユーザーから与えられたバイト数を割り当て、割り当てられたメモリを解放する別の関数がある関数を使用しています。メモリセグメントは、xの等しいサイズのリストノードを含むプールとして機能します。以前のmallocを解放しようとしたときにエラーが発生しました

初期関数:

void create_mem(int mem_size, int num_n){ 
    number_of_nodes = num_n; 
    mem_block = malloc(mem_size); 
    header = mem_block; 
} 

ヘッダファイルnumber_of_nodes、intとしてヘッダとmem_block、list_node *及びチャー*をそれぞれ有しています。

私もヘッダファイルにlist_node構造を有する:

typedef struct list_node { 
    list_node* next; 
}list_node; 

削除機能:

void delete_mem(){ 
    free(mem_block); 
} 

をリストの作品と私のコードは正常に動作insert_nodesとdelete_nodesが含まれていますが、いつでも私のメインプログラムは私のプログラムがクラッシュするdelete_mem関数を呼び出します。私はdelete_mem機能を変更

void delete_mem(){ 
    mem_block = NULL; 
    free(mem_block); 
} 

私はエラーを取得していないが、私は、この削除機能は、実際に私はそれが何をしたいのかいないと思います。

メモリを解放しようとする前に元のmem_blockの中にあるものはすべて削除する必要があると思いますが、その方法についてはわかりません。

+4

情報が不十分です。 [mcve]を投稿してください。 – kaylum

+0

明らかに、 'mem_block = NULL'を代入すれば、その後の' free() 'は' free(NULL) 'と等しくなり、何もしません。 –

+0

ベスト推測:どこか(else)あなたは 'mem_block'に新しい値を割り当てています。自由にしようとすると、その値はもはや' malloc() 'から受け取った値ではなくなります。 –

答えて

0

変数mem_blockの値がmallocの後で変更されていないことを確認してください。

それがトラブル

2

で、free(mem_block);意志の呼び出しを変更した場合は逆方向にそれをやりました。 NULL最初に変数を設定すると、メモリがリークしたことを意味し、次にfree(NULL)となります。 free(NULL)は合法ですが、それはノーオペレーションです。あなたがポインタのトラックを失ったので、リークを修正するのは遅すぎます。用途:

void delete_mem(){ 
    free(mem_block); 
    mem_block = NULL; 
} 

freeへの最初の、そしてNULLアウト。 INGの

それが「所有」私はmem_blockにあるかもしれないのか分からないが、それは他の割り当てられたメモリへのポインタが含まれている場合、あなたは任意のポインタ(S)の深さ優先探索を行う必要があるだろう、free "手足"をバックアップする前に外の "葉"を残しているので、それに格納されているすべてのポインタがfree -edになるまで、freeのメモリは記憶されません。

関連する問題