drvm *drv
関数に構造を作成します。malloc()-ed
この構造自体には、フィールド ( )を含むフィールドが含まれていますuint32_t *buffer
。それを行うコードは次のようになります。
...
size_t elm_size = sizeof(model*);
uint32_t length = *(uint32_t*)len;
GArray *models = g_array_sized_new(FALSE, FALSE, elm_size, length);
model *mod;
for (int i = 0; i < length; ++i) {
mod = create_model(...);
g_array_append_val(models, mod);
}
このコードにはエラーがなく、十分にテストされています。プログラムの開始時に、実行時にすべてのリソース(特にメモリ)を消去する関数をfree_all()
( によって)登録します。atexit()
exit()
elements of GArray*
この関数内で、 (model *
構造体)のメモリとそれ自体のメモリを解放しようとしていGArray *
ます:
GArray *models;
g_array_set_clear_func(models, clean_model);
if(!g_array_free(models, FALSE)) { //OK }
問題は、ライブラリclean_model(void *data)
内で呼び出されたときに、1 つの要素glib
へのポインタが含まれていることをお勧めします。model *
しかし、アドレスが間違っています。正しい値を指していないようです。どちらGArray*
でもないmodel*
。
さらにGArray *models
、free_all()
機能は正しく(作成時と同じ)、すべてのGArray *
要素を反復処理free_all()
すると
for (int i = 0; i < len; ++i) {
mod = g_array_index(models, model*, i); // Here I get correct pointer to model*
clean_model(mod);
}
期待値が出ます。
質問:何が問題なのですか? GArray *
これらの要素にメモリが含まれている場合、要素のメモリを解放するにはどうすればよいmalloc()-ed
ですか?
ヘッダーの一部:
struct _info {
uint32_t *buffer;
uint32_t len;
};
typedef struct _info info;
struct _prod {
uint32_t *buffer;
uint32_t len;
};
typedef struct _prod prod;
struct _model {
uint32_t name;
prod product;
info inform;
};
typedef struct _model model;
struct _drvm {
GArray *models;
GArray *strings;
};
typedef struct _drvm drvm;