【发布时间】: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