使用glib的哈希表的行为

| 我想将音量更新为每个@IP。因此,例如,每隔5秒我就将每个@IP(i)的V(i)相加。好的,现在哈希表工作正常,每T秒保持更新一次。但是问题是,经过一段时间后,我发现有时在哈希表中重复相同的ip地址两次甚至很多次。这样,当我关闭进程时,我发现相同的@IP重复了太多次。就像哈希表有问题一样。 这是此函数\“ update_hashTable()\”如此重要的代码,每隔X秒就会调用一次,我怀疑实际上是内存泄漏……因为我总是为IP @调用
malloc
。 但它继续工作...任何想法?
int update_hashTable( ... ) {

u_int32_t *a;

... //declarations

struct pf_addr *as;


as = ks->addr[0];

a = (u_int32_t*)malloc(sizeof(u_int32_t));

*a = ntohl(as->addr32[0]);

sz = value; // no matter it is... an int for example

if (ReturnValue=(u_int32_t)g_hash_table_lookup(hashtable, a)) {

  ReturnValue +=sz;
  g_hash_table_insert(hashtable, (gpointer)a, gpointer)ReturnValue);
}
else {
  g_hash_table_insert(hashtable, (gpointer)a, (gpointer)sz);
}
    
已邀请:
        确实,您似乎有内存泄漏,但这不是您的问题。问题在于if语句的true-path只是重新插入了与相同键关联的第二个值,这不是您想要的。 此“检查是否存在”和“增量”算法的典型模式通常类似于
gpointer val = g_hash_table_lookup(hash_table, key);
if (val == NULL) {
    val = g_malloc0(...);
    g_hash_table_insert(hash_table, key, val);
}
*val = /* something */;
重要的是,一旦有了指向与某个键关联的值的指针,就可以直接对其进行直接修改。 如果此代码将由多个线程并行执行,则整个块应由互斥锁保护,也许使用GMutex:http://developer.gnome.org/glib/2.28/glib-Threads.html gcc提供了原子内置的内在函数,例如原子地递增值,请参见http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html     

要回复问题请先登录注册