A GSList
не является GObject
, т. Е. Оно не обеспечивает механизм, необходимый для работы макросов проверки типа, что приводит к аварийному завершению, которое вы наблюдаете.Если вам действительно нужны такие функции, вам может потребоваться создать оболочку (на основе GObject
) для ваших списков.
К сожалению, вы не можете проверить тип значения в вашей хэш-таблице;макросы проверки типов, используемые GObject
и GTK, на самом деле требуют специальной поддержки в указанном значении, т. е. вы должны точно знать, что значение является чем-то, что использует механизм GObject
, прежде чем вы сможете использоватьмакросы в первую очередь.Результаты просто не определены, если они применяются к указателям на что-либо, кроме GObject
-производных типов, и чаще всего приводят к сбоям.
Обратите внимание, что эта проблема возникает со строковыми значениями(char*
) и другие значения.(Почему вы преобразуете "value"
в char*
?)
Если вам действительно нужно работать с универсальной хеш-таблицей, как указано в вашем примере, вам придется создать какую-то оболочку;либо напрямую выводите его из GObject
, либо попробуйте что-нибудь минимальное, например
typedef struct {
int type_code;
union {
int ival;
char* str;
GObject* obj;
GSList* list;
} value;
} Cell;
typedef enum {
INTEGER, STRING, OBJECT, LIST
} CellType;
Cell*
allocate_int_cell(int value)
{
...
}
К сожалению, все еще сложнее, потому что вам также придется управлять уничтожением ваших значений, когда они удаляются из хешатаблица (или если сама хеш-таблица уничтожена).