1

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 *modelsfree_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;
4

1 に答える 1