異なるスレッド間でグローバルセットを共有しているので、必要なメモリをどれだけ配置するかによってメモリを割り当てます。キンダーのようなバッファ。同じスレッドから解放しようとすると、glibは狂ってsegfaultsになります。mallocとC言語のスレッド間でメモリを解放する
私は遠くに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"
どのように無効な無料ですか?
無料でアンパサンドが間違っています。 'bufferaction'を使う場所を私たちに教えてください。 – cnicutar
他のスレッドからメモリにアクセスしている可能性があるので、これらの 'free()'呼び出しをミューテックスロックするように注意してください。 – Gui13
バッファオーバーフローの可能性もあります。バッファリングに十分なスペースを確保していますか? – w00