userpro / MemoryPool

一个极简内存池实现
MIT License
279 stars 97 forks source link

使用windows的wchar_t分配内存后释放存在问题 #10

Closed lengkristy closed 4 years ago

lengkristy commented 4 years ago

使用windows的wchar_t分配内存后释放存在问题,本来我是分配的2G,释放之后只有几百个字节可用

userpro commented 4 years ago

贴一下复现代码

lengkristy commented 4 years ago

define MP_DLINKLIST_INS_FRT(head, x) \

do {                              \
    x->prev = NULL;               \
    x->next = head;               \
    if (head) head->prev = x;     \
    head = x;                     \
} while (0)

在调用MemoryPoolFree的时候,ck = (_MP_Chunk) ((char) p - MP_CHUNKHEADER);计算得出cx的alloc_mem只有440,然后赋值给head,导致mp->mlist->free_list->alloc_mem为440。在没有赋值之前,这个mp->mlist->free_list->alloc_mem为1598532628。但是我看到在mp->mlist->free_list->next中mem为1598532628,导致下一次分配内存的时候就不能分配了

lengkristy commented 4 years ago

反正用着就是很奇怪,我是通信服务端用的,并发也比较高

userpro commented 4 years ago

你是并发场景下用吗 有打开readme里说明的线程安全的宏定义吗

:octocat: From gitme Android

lengkristy commented 4 years ago

线程安全我是用的windows的机制WaitForSingleObject(mp->lock, INFINITE);

lengkristy commented 4 years ago

感觉这里的释放逻辑好像有点BUG,我没有仔细看过你的代码,今天才开始用

userpro commented 4 years ago

替换了MP_LOCK和MP_UNLOCK的宏定义吗

:octocat: From gitme Android

lengkristy commented 4 years ago

嗯,我自己单独写了两个函数进行同步控制的: //加锁 void MP_LOCK(MemoryPool* mp) { do {

ifdef MS_WINDOWS

    WaitForSingleObject(mp->lock, INFINITE);

endif

} while (0);

}

//解锁 void MP_UNLOCK(MemoryPool* mp)
{ do {

ifdef MS_WINDOWS

   SetEvent(mp->lock);

endif

} while (0);

}。

lengkristy commented 4 years ago

这个不能粘短视频,不太好给你描述这个细节

userpro commented 4 years ago

方便加个wx说吗

:octocat: From gitme Android

lengkristy commented 4 years ago

我的微信号:lengkristy