外部库和pthread内存泄漏

时间:2014-01-12 06:40:40

标签: qt memory-leaks pthreads extern

我在Qt下使用pthread的程序遇到问题。

由于我开始使用外部库,我处理奇怪的内存泄漏。

为了表示问题,我准备了这个简单的例子:

extern "C" short __stdcall somefunction(some_parameters);

void *runThread( void *arg )
    {
    printf("I'm a thread...\n");
    pthread_exit(NULL);
    }

int main()
    {
    somefunction(some_parameters);

    pthread_t thread;
    pthread_attr_t attr;

    while(1)
        {
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        pthread_create( &thread, &attr, &runThread, NULL);
        pthread_attr_destroy ( &attr );

        Sleep(1000);
        }
    }

如果我不在线somefunction(some_parameters); ,请对pthread_...内的while注释然后泄漏停止了。

该图书馆来自第三方提供商,但我无法访问该图书馆的源代码。

库可能不是线程安全的吗?无论如何,我认为很奇怪,因为我没有从线程内部调用somefunction

造成这种奇怪行为的原因是什么?

编辑:不知道这是否有用,但这段代码是使用Qt5.2 + mingw编译的,该库是使用MSVC编译的,我是在链接程序到它的DLL。

提前致谢!

编辑:最后在使用线程时外部库中发生了一个错误,导致内存泄漏,然后发现第二次泄漏与pthreads相关(Detached pthreads and memory leak)谢谢大家的支持。

1 个答案:

答案 0 :(得分:0)

这个问题看起来很熟悉。你在这里描述的内容也指向QT + Windows bug。如果使用CreateThread而不是_beginthreadex是泄漏的原因,那么可以解释添加和删除some_function(some_parameters):

如果some_function()调用了一些C运行时函数,那么如果QT的其余部分没有进行这些调用,则将其注释掉可能会阻止泄漏。测试结果可能取决于执行路径 - 在某些地方QT正确调用_beginthreadex。