에게 간단한 테스트 할당을 해제하지 않습니다 Windows에서 메모리 누수가 발생했습니다. `pthread_join` 메모리
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();
}
는 말했다 :
스레드는 할당 된 자원이고 당신은 종료하기 전에 그것을 해제하지 않았다.
pthread_join
으로 전화해야합니다. 이것은 또한 귀하의 hackish 및 잘못된 수면 루프에 대한 필요성을 제거합니다.한번 수정해도 valgrind는 POSIX 스레드 (glibc/NPTL을 사용하고있는 것 같습니다)의 일부 구현이 스레드 리소스를 해제하지 않고 캐시하고 재사용하므로 "누수"가 계속 표시 될 수 있습니다 충분히. valgrind가이 문제를 해결하는지 모르겠다.
하지만 이미 pthread_join
을 사용합니다. VS2015 및 해당 힙 분석기를 사용합니다. 문제가 pthread
내 특정 구현에있을 수 있습니까? 모든 pthread에 대한
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.
24 바이트 : 나는 동성 노래로
원인 메모리 누출을 PAL을 사용합니다. pthread_join()
은 메모리를 확보해야하지만 그렇지 않았습니다. 그래서 구현이 버그라고 가정합니다. 이 점을 확인하거나 불평하십시오.
'CrtSetDbgFlag'는 분석하기에 충분하다고 생각합니다. 나는'pthreads '를 디버깅하지 않을 것이다. 그것은 그것이 버그이거나 내가 어딘가에서 실수를 인정하는 것으로 충분하다. – kyb
@kyb 만약 실수를 정정하고자한다면'CrtSetAllocHook'는 결함이있는 메모리 블럭이 스택이나 pthreads 라이브러리로부터 할당되었는지 보여줍니다. –