如何解决使用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)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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。