2016-12-09 1 views
0

에게 간단한 테스트 할당을 해제하지 않습니다 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(); 
} 

Here

는 말했다 :

스레드는 할당 된 자원이고 당신은 종료하기 전에 그것을 해제하지 않았다. 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()은 메모리를 확보해야하지만 그렇지 않았습니다. 그래서 구현이 버그라고 가정합니다. 이 점을 확인하거나 불평하십시오.

답변

0

할당 점을 추적하려면 _CrtSetAllocHook을 참조하십시오. 할당 훅을 직접 설정할 수 있으며 누출 될 블록을 스택에서 검사 할 수 있습니다. 그러나 이것이 어떤 이점을 가져 오려면 올바르게 스택을보기 위해 POSIX 구현의 디버그 버전이 필요합니다. 그런 다음 메모리를 해제 할 수 있도록 실제 패치를 시도해 볼 수 있습니다.

+0

'CrtSetDbgFlag'는 분석하기에 충분하다고 생각합니다. 나는'pthreads '를 디버깅하지 않을 것이다. 그것은 그것이 버그이거나 내가 어딘가에서 실수를 인정하는 것으로 충분하다. – kyb

+0

@kyb 만약 실수를 정정하고자한다면'CrtSetAllocHook'는 결함이있는 메모리 블럭이 스택이나 pthreads 라이브러리로부터 할당되었는지 보여줍니다. –

관련 문제