简单的测试:
void testMemoryLeak_PthreadCreateJoin(void)
{
auto taskFunction = [](void*args) -> void*
{
return nullptr;
};
pthread_t pth;
int err = pthread_create(&pth, /*attr*/nullptr, taskFunction, /*args*/nullptr);
pthread_join(pth, nullptr);
}
void main(void)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
}
Here说:
线程是已分配的资源,您在退出之前没有释放它。你应该致电
pthread_join
;这也可以消除你的hackish和不正确的睡眠循环的需要。有可能即使你解决了这个问题,valgrind仍然会看到“泄漏”,因为POSIX线程的一些实现(我猜你正在使用glibc / NPTL)缓存并重用线程资源而不是完全释放它们。我不确定valgrind是否可以解决这个问题。
但我已经使用pthread_join
了。我使用VS2015及其堆分析器。问题可能在pthread
我的具体实施中吗?我用Dongsheng Song的PAL
导致内存泄漏:
Detected memory leaks!
Dumping objects ->
{104} normal block at 0x007742C0, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{101} normal block at 0x00774398, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{98} normal block at 0x00774038, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{95} normal block at 0x00774860, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
Object dump complete.
每个pthread 24个字节。 pthread_join()
必须释放记忆,但事实并非如此。所以我认为实施是错误的。请确认或解释。
答案 0 :(得分:0)
如果要追踪分配点,请参阅_CrtSetAllocHook - 您可以设置自己的分配挂钩,并检查堆栈中是否存在泄漏的块。但是,为了带来任何好处,您需要POSIX实现的调试版本才能正确查看堆栈。然后你可以尝试实际修补它,以便释放内存。