2016-12-04 12 views
1

ベクトルがstruct aです。サイズはコンパイル時には分かりません。mallocは再帰的に動作しますか?

すべてstruct aには、struct bというベクトルへのポインタが含まれています。 struct bのベクトルの長さはコンパイル時には分かりません。だから、

私はこれを行う場合:例えば

#include <stdio.h> 
#include <stdlib.h> 

struct b { 
    int n; 
}; 

struct a { 
    int n; 
    struct b *v; 
}; 

int main() { 

    struct a *s; 
    struct a *ta; 
    struct b *tb; 

    s = (struct a*)malloc(sizeof(struct a) * 32); 
    s->v = (struct b*)malloc(sizeof(struct b) * 32); 
    s->n = 1234; 
    ((s->v)+1)->n = 5678; 

    fprintf(stderr, "%p: %i/%p: %i\n", s, s->n, (s->v)+1, ((s->v)+1)->n); 

    ta = s; 
    tb = (s->v)+1; 

    free(s); 
    fprintf(stderr, "%p: %i/%p: %i\n", ta, ta->n, tb, tb->n); 

    return 0; 
} 

出力:

0x1cb3010: 1234/0x1cb3224: 5678 
0x1cb3010: -1526330504/0x1cb3224: 5678 

は同じポインタ内のメモリ・ブロックが割り当てられているとき、自動的に解放されます万が一構造体Bのベクトルをいましたか?または、struct aベクトルのすべてのアイテムについて、最初に個別のstruct b個のベクトルを解放する必要がありますか?

The question on this linkは、この記事の重複として示唆されているが、ここで疑問がfreeコール内で、代わりに再帰的な手順を作成する方法についてアドバイスを求めての既存の機能について尋ねます。

+5

いいえ、手動で行う必要があります。 –

+2

また、 'malloc'の結果をキャストすべきではありません – UnholySheep

+4

文書のどの部分がそうであるかのように思われる部分はありますか? –

答えて

1

malloc()ごとに、対称のfree()が必要です。

Linux環境で作業している場合は、valgrindを使用してプログラムをチェックすることができます。

実行:

valgrind --leak-check=full ./my_prog 

とあなたのエラーに関する

+0

私はこの 'valgrind'ツールについて知りませんでした。これは良い、建設的な答えです。誰かがこれを読んで漏れがあるかどうかを自分で証明するのは簡単です。ありがとう。 – lash

3

短い答えを読む:いいえ、あなたはすべてのmallocためfreeを持っている必要があります。

もっと良い答え:まだありませんが、複数の構造体メンバを解放する関数を書くことができます。ここに例があります:

void freeStruct(struct a *foo) 
{ 
    free(foo->v); 
    free(foo); 
} 

また、Don't cast the return value of mallocです。

+1

'free()'は 'free(NULL)'を許可します。フリーのような関数は、 'if(foo)free(foo-> v);のように、それ自身を保護すればその機能を近づけるでしょう。 – chux

関連する問題