gpt4 book ai didi

c - malloc和释放C中线程之间的内存

转载 作者:行者123 更新时间:2023-12-02 08:49:02 26 4
gpt4 key购买 nike

我在不同线程之间共享一组全局变量,所以我根据需要分配多少内存,具体取决于分配给它的内存量。有点像缓冲。每当我尝试从同一线程但从不同功能中释放它时,glib就会发疯并出现段错误。

我到目前为止还不是C程序员。我正在尝试清除我一起入侵的代码中的内存泄漏。

char *keybuffer[], *valuesbuffer[], *returnbuffer[], *bufferaction;
int memcache_lock=1,*bufferelements, bufferowner=0;


void memcache_clear_buffers(){
free(&bufferaction); //I get the same reaction when I have the & and without the &
// free(*keybuffer); //I thought maybe I need to use the pointer. Then
// free(*valuesbuffer); // I thought maybe I needed to reference the address in memory.
// free(*returnbuffer); // I appreciate any help.
// free(*bufferelements);
}

void memcache_allocate_buffers(int size){
*keybuffer = (char *)malloc(size * sizeof(char *));
*valuesbuffer = (char *)malloc(size * sizeof(char *));
*returnbuffer = (char *)malloc(size * sizeof(char *));
bufferelements = malloc(sizeof(int));
bufferaction = (char *)malloc(sizeof(char*));
}

这是valgrind的输出。
 3500== Invalid free() / delete / delete[]
==3500== at 0x4027C02: free (vg_replace_malloc.c:366)
==3500== by 0x4191D4C: memcache_clear_buffers (dm_memcache.c:254)
==3500== by 0x41921ED: memcache_set (dm_memcache.c:328)
==3500== by 0x4192281: memcache_sid (dm_memcache.c:151)
==3500== by 0x418316D: db_user_exists (dm_db.c:3208)
==3500== by 0x403F7F2: auth_user_exists (authsql.c:49)
==3500== by 0x419ADA6: auth_user_exists (authmodule.c:130)
==3500== by 0x4040D4E: auth_validate (authsql.c:333)
==3500== by 0x419B106: auth_validate (authmodule.c:163)
==3500== by 0x74656CFF: ???
==3500== Address 0x41b55c0 is 0 bytes inside data symbol "bufferaction"

无效的免费怎么办?

最佳答案

  • malloc()和free()不是线程安全的函数。您需要使用互斥量保护对这些函数的调用。
  • 您还需要使用互斥量保护所有共享变量。您可以使用与malloc / free相同的名称,每个变量一个。
  • 您需要将在多个线程之间共享的变量声明为volatile,以防止某些编译器出现危险的优化器错误。请注意,这不能替代互斥防护。
  • 是缓冲区数组还是二维数组(如C字符串数组)?您已将所有缓冲区声明为潜在的二维数组,但从未分配最里面的维。
  • 切勿在C语言中强制转换malloc的结果。请阅读thisthis
  • free(bufferaction),而不是free(&bufferaction)
  • 显式初始化所有指向NULL的指针。在free()之后,确保将指针设置为NULL。在任何一个线程访问内存之前,请确保检查指针是否为NULL。
  • 关于c - malloc和释放C中线程之间的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989496/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com