我的程序失败,检测到堆栈粉碎,并且我从Valgring获得的唯一消息是“丢失记录中的块可能丢失”重复了三遍,并且
我不知道该怎么解决。
==3726== 144 bytes in 1 blocks are possibly lost in loss record 74 of 87
==3726== at 0x4025315: calloc (vg_replace_malloc.c:467)
==3726== by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==3726== by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==3726== by 0x40405C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==3726== by 0x806BF36: Thread::Thread(void* (*)(void*), void*) (os.cpp:203)
这是代码,Valgrind是pthread_create调用。
Thread::Thread( PFUNC func, void * arg )
{
int s = pthread_create( &_ThreadId, NULL, func, arg); //here is msg from valgrind
if (s != 0)
throw EXCEPT_NOTHREAD;
pthread_detach( _ThreadId );
}
请您帮我看看Thread函数有什么问题吗?我读过其他类似的问题,即创建线程之前必须存在pthread_detach?
非常感谢。
最佳答案
没有什么“错”。它只是在程序结束之前不释放线程的资源,Valgrind将此报告为内存泄漏。由于您已分离线程,因此线程终止之前不会释放其资源。如果它没有在程序执行之前终止,则可能被报告为泄漏。
您不需要使用pthread_detach
;用来使线程负责释放自己的资源。如果您不使用它,则在停止该线程时,另一个线程将需要调用pthread_join
。
如果您想清理泄漏,那么您必须保持线程句柄(假设_ThreadId
是成员变量,而不要分离线程)。然后,在程序结束之前,告诉线程停止,然后调用pthread_join
等待它并释放其所有资源。删除一个(可能无害的)警告是否值得这样做麻烦,但是干净的关机可能有助于避免更严重的潜在问题。
顺便说一句,您不应使用像_ThreadId
这样的名称,这些名称以_
开头,后跟一个大写字母;这样的名称是保留的。
关于c++ - 可能丢失在pthread_create的丢失记录中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12754954/