2017-07-20 42 views
0

私はPyObjectとPythonオブジェクトシステムのような多態的なシステムをC言語で実装しようとしています。しかし、私は基本構造体からの構造体キャストをどのように解放することができるかを理解できません。より大きな構造体ポインタのすべてのメモリの解放を、より小さなものから解放しますか?

#include "stdio.h" 
#include "stdlib.h" 

//testing for garbage collection 

//base handler to ensure polymorphism 
#define BASE char g; 

struct temp { 
    BASE 
    short w; 
}; 

struct femp { 
    BASE 
    short w; 
    long d; 
}; 


int main(void) { 
    struct femp* first = malloc(sizeof(struct femp)); 
    first->d = 3444; 
    struct temp* second = (struct temp*)first; 
    free(second); // does this deallocate all the memory of first? 
    free(first); 
    return 0; 
} 

ノート:私は、次のベースと高度な構造体の型を実装している第二が解放される場合は、上記のプログラムはなく、まず、ゼロ以外のステータスで終了します。

結果:

7fb829d02000-7fb829d04000 rw-p 00000000 00:00 0 
7fb829d0c000-7fb829d10000 rw-p 00000000 00:00 0 
7fb829d10000-7fb829d11000 r--p 00023000 00:136 38      /usr/lib/x86_64-linux-gnu/ld-2.24.so 
7fb829d11000-7fb829d12000 rw-p 00024000 00:136 38      /usr/lib/x86_64-linux-gnu/ld-2.24.so 
7fb829d12000-7fb829d13000 rw-p 00000000 00:00 0 
7fffac407000-7fffac428000 rw-p 00000000 00:00 0       [stack] 
7fffac499000-7fffac49b000 r--p 00000000 00:00 0       [vvar] 
7fffac49b000-7fffac49d000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
exited with non-zero status 

私の質問は、メモリのすべての自由はまだ、オリジナルのmallocさより大きなサイズの構造体からキャストされた小さなサイズの構造体へのポインタにfree()を呼び出すんですか?私のコードのように、最初または2番目を解放することとの違いはありますか?あなたは解放する前に常に元のタイプにキャストし直すべきですか?

+1

"構造を割り当てる"ことはできません。メモリの量を割り当てます。 Mallocは、バイト数である整数の引数をとります。 Freeはただ多くのバイトを解放します。どちらも構造については何も知らない。 –

+0

'free'は' void'へのポインタを取っています。だから、それが以前にキャストされたものは本当に気にしない。 –

+0

これは、元々mallocされていたサイズのstructを自由にしなければならないということですか?正しい? –

答えて

3

malloc()/free()あなたの構造については何も知らない。 malloc()は整数の引数をとり、その多くのバイトを割り当て、メモリアドレスを与えます。 free()はそのアドレスを取り、割り当てられたものを解放します。その間にあなたがするのはあなた次第です。

2つのうちのいずれかの可能性があるメモリが必要な場合は、それが十分に大きいことを確認する必要があります。あなたが5ガロンのバケツを割り当て、それを使って3ガロンを運ぶのであれば問題ありません。あなたが7ガロンを運ぶことを試みれば、あなたはあなたの足を濡らすでしょう。 Cはあなたに干渉することもありません。

+0

OKこれは理にかなっていますが、この場合、ポインタを小さな構造体に解放すると、ゼロ以外のステータスが発生するのはなぜですか? –

+2

同じアドレスを2回解放しているためです。 –

関連する問題