【问题标题】:External library and pthread memory leak外部库和 pthread 内存泄漏
【发布时间】:2014-01-12 06:40:39
【问题描述】:

我在使用 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);OR 如果我不创建线程(通过注释while 中以pthread_... 开头的行),那么泄漏就会停止。

该库来自第三方提供商,我无权访问它的源代码。

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

这种奇怪行为的原因可能是什么?

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

提前致谢!

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

【问题讨论】:

  • 即使不知道 somefunction 应该做什么也很难猜测。无论如何,这个问题与 Qt 有什么关系? Somefunction 是 Qt 函数吗?如果没有,我会亲自删除该标签。
  • 你可以试试 valgrind 看看它是否报告了一些有用的东西
  • @Lazlo 谢谢你的评论,我忘了说这段代码是用 Qt5.2(mingw 编译器)编译的,但库是用 MSVC 编译的。我将添加此信息。
  • 感谢您的评论@Frank!不幸的是,这个库仅适用于 Windows 平台,所以我认为我无法使用 Valgrind,如果我错了,请纠正我。
  • @Lazlo someFunction(和整个库)实际上是检查是否存在安全加密狗。

标签: qt memory-leaks pthreads extern


【解决方案1】:

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

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

【讨论】:

  • 你好@SergeyD。最后,在使用开发人员解决的线程时,这是外部库中的一个错误(经过测试),但存在与 pthreads 相关的第二次泄漏,这就是为什么我打开第二个问题并避免提及库以避免混淆。
猜你喜欢
  • 2012-10-19
  • 2019-01-08
  • 2018-01-13
  • 1970-01-01
  • 2015-12-09
  • 2014-01-20
  • 2012-06-22
  • 2017-02-10
  • 1970-01-01
相关资源
最近更新 更多