GHashTable的key和value都是gpointer,也就是说,如果想用一个string来做key的话,key的类型就只能是char *,即便如此,用string做key也是不行的。
因为key是指针,我们没法保证两个char *的值是一样的。就算我们重载了GHashTable key的compare函数,也无法达到这一目的。
所以,可以考虑使用data list来代替。GLib中的data list,key只能是string或者GQuark,value就是gpointer。使用data list,两个key的指针可以不同,因为在设置key的时候,data list会将字符串复制到它内部的数据结构中,这样下次取出数据的时候,就真的做的是字符串比较了,而不是简单的去比对指针。而且作为key的string,如果调用了类似g_datalist_set_data之后,这个string就可以free掉了,因为字符串已经被拷贝到data list中去了。
gobject中的g_object_set_data使用的就是data list。