1

私はCベースのライブラリを書いていfree()ますが、メモリのブロックの割り当てを解除するために使用することに関しては少し混乱しています...基本的に私はこのように定義されたいくつかの同様の構造体を持っています:

typedef struct
{
    pthread_t thread_id;
    pthread_attr_t attr;
    void     *data;
    size_t stacksize = NULL;
} thread_info;

基本的realloc()に、この構造にメモリを割り当て、それを指す配列を持つために使用します。

私の質問は、私が使用する場合:

free(my_array[thread_index]); 

free()呼び出しは、構造だけでなく、その中のすべてのデータ型によって使用されるメモリの割り当てを解除しますか?* thread_id *、attrdata、およびstacksizeも割り当て解除されます。または、それらを個別に割り当て解除してから、配列から構造体の割り当てを解除する必要がありますか。

私にとって、そのfree()ような構造体で使用している場合、その構造体に含まれるすべてのデータの割り当てが解除され、各構造体属性の割り当てを明示的に解除する必要はありませんが、それが当てはまるかどうかを確認したいだけです。

4

3 に答える 3

3

構造体内のリソースの割り当てを明示的に解除する必要があります。そうすれば、構造体自体の割り当てを解除できます。構造体の割り当てを解除するだけの場合、内部のリソースは割り当て解除されず、リークします。

于 2012-06-13T15:24:42.907 に答える
3

動的に割り当てられた「構造体」(つまり、配列、構造体などの階層)の場合、「ボトムアップ」から各ポインターをfreeで呼び出す必要があります。この操作は、ツリーの深さ優先走査を実行するものと考えることができます。

通常の制限は、ヒープではなくスタック上のメモリへのポインタである変数に適用されます。たとえば、、などで定義された変数とtype[n]、関数ファミリーをchar[n] = 'abc'使用したヒープからの割り当て。*allocまた、同じアドレスへの複数のポインタがある場合にも注意してください。freeこれらを2回呼び出すと、プログラミングエラーになります(ただし、必ずしもセグメンテーション違反ではありません)。

于 2012-06-13T15:24:53.860 に答える
1

free()で明示的に割り当てられたすべてのデータを使用する必要がありますmalloc()malloc()への呼び出しと仮想的にミラーリングされたへのすべての呼び出しfree()

constructor()基本的に、構造とデータを構造内に割り当てる関数と、それを割り当て解除する関数を定義できますdestructor()。これは、次のコードスニペットのようなものである可能性があります。

int32_t         constructor(thread_info **t)
{
  if (NULL == (*t = malloc(sizeof (thread_info)))) {
    return -1;
  }

  if (NULL == ((*t)->data = malloc(sizeof (__data__)))) {
    return -1;
  }

  return 0;
}

int32_t         destructor(thread_info *t)
{
  if (free(t->data)) {
    return -1;
  }

  if (free(t)) {
    return -1;
  }

  return 0;
}
于 2012-06-13T15:45:07.380 に答える