2016-12-09 9 views
0

Простой тест:Утечка памяти в windows pthread. `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; это также устранит необходимость вашей хакерской и неправильной петли сна.

Возможно, что даже после того, как вы исправите это, valgrind по-прежнему будет видеть «утечку», поскольку некоторые реализации потоков POSIX (я предполагаю, что вы используете glibc/NPTL) и повторно используете ресурсы потоков, а не освобождаете их в полной мере. Я не уверен, работает ли valgrind или нет.

Но я уже пользуюсь pthread_join. Я использую VS2015 и его анализатор кучи. Может ли проблема быть в pthread моей конкретной реализации? Я использую 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. 

24 байта для каждого PTHREAD. pthread_join() должен был освободить память, но этого не произошло. Поэтому я предполагаю, что реализация глючит. Пожалуйста, подтвердите или подтвердите это.

ответ

0

Если вы хотите отследить точку выделения, см. _CrtSetAllocHook - вы можете установить свой собственный крюк выделения и изучить стек для тех блоков, которые вы знаете, которые будут просочиться. Однако для того, чтобы принести какие-либо выгоды, вам понадобится отладочная версия реализации POSIX, чтобы правильно видеть стек. Затем вы можете попробовать и исправить его так, чтобы память была освобождена.

+0

Я думаю, что 'CrtSetDbgFlag' достаточно хорош для анализа. Я не хочу отлаживать 'pthreads'. Достаточно знать, что это глючит, или я допускаю ошибку где-то. – kyb

+0

@kyb хорошо, если вы хотите разобраться в своих ошибках, тогда «CrtSetAllocHook» покажет, выделены ли поврежденные блоки памяти из вашего стека или из библиотеки pthreads. –

 Смежные вопросы

  • Нет связанных вопросов^_^