私は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番目を解放することとの違いはありますか?あなたは解放する前に常に元のタイプにキャストし直すべきですか?
"構造を割り当てる"ことはできません。メモリの量を割り当てます。 Mallocは、バイト数である整数の引数をとります。 Freeはただ多くのバイトを解放します。どちらも構造については何も知らない。 –
'free'は' void'へのポインタを取っています。だから、それが以前にキャストされたものは本当に気にしない。 –
これは、元々mallocされていたサイズのstructを自由にしなければならないということですか?正しい? –