C++ 带有堆栈变量的pthread内存泄漏

C++ 带有堆栈变量的pthread内存泄漏,c++,multithreading,memory-leaks,pthreads,C++,Multithreading,Memory Leaks,Pthreads,我注意到,当我使用窗体中的线程调用方法时 ////main code///// pthread_t thread; pthread_create(thread,function,data); ////////////////// void* function(void* data){ //work with some data on the heap via a vector on the stack std::vector<double> variable (

我注意到,当我使用窗体中的线程调用方法时

////main code/////
pthread_t thread;
pthread_create(thread,function,data);
//////////////////

void* function(void* data){

    //work with some data on the heap via a vector on the stack

    std::vector<double> variable (100,1.2345);

    //do contents of thread

    pthread_exit(NULL);
}
内存泄漏没有发生

似乎
pthread\u exit(NULL)
不会像使用
return
在正常函数结束时那样清除堆栈变量(我是对的?!),因此将它们放在自己的范围内可以确保它们被释放

然而,这似乎是一个巨大的难题。如何确保在退出pthread时正确清除堆栈变量(以及它们在堆中的容器内容)?

new()
的调用隐藏在
std::vector
实现中

在第一个代码示例中
pthread_退出(NULL)std::vector
析构函数之前,code>将退出线程,因此内存泄漏

第二个示例强制在
pthread_退出(NULL)之前调用
std::vector
的析构函数

似乎
pthread\u exit(NULL)
没有清除堆栈变量,就像您在返回正常函数结尾时得到的那样(我是正确的?!)

这就像在非线程代码中调用
exit(0)
,程序会立即退出,而不会释放堆栈。(因为pthSPEC是用C定义的,而不是C++,它不定义C++析构函数会发生什么,所以它是平台特定的)。 因此,将它们放在自己的范围内可以确保它们得到释放

因为这样,向量的析构函数在调用
pthread\u exit()
之前运行

如何确保在退出pthread时正确清除堆栈变量(以及它们在堆中的容器内容)

只要从线程函数返回,就不需要使用
pthread\u exit
退出线程启动函数(传递给
pthread\u create
)。说:

当第一次调用
main()
的线程以外的线程从用于创建它的启动例程返回时,会隐式调用
pthread\u exit()

同样的事情,他说的略有不同:

从任何线程的start函数执行返回,而不是 主线程使用 函数的返回值作为线程的退出状态

您可以使用
pthread\u exit
从堆栈下的其他函数中退出线程,就像您可以使用
exit()
退出程序,而不是从
main()
返回,但在最外层的函数中只返回
NULL(或任何您想要的返回值)

唯一一次使用
pthread\u exit(x)
只需
返回x位于
main
中,它将导致程序等待其他线程完成。

(好的,我可以看到其他人已经解决了这个问题……是的,这只适用于可接合线程。如果尝试分离不可接合的线程,则会引发错误。)

您需要调用
pthread\u detach(…)
来配置pthread,以便在退出时回收资源

这并不是要使其他任何答案无效。但是,如果希望在退出时回收其堆栈空间,则需要分离任何未加入的可加入子线程!你为什么不想这样


即使您通过更改代码来解决这个特定的漏洞,如果您要在C/C++中使用子线程编程,也需要进一步了解这个问题
std::thread
boost::thread
有类似的要求。

什么平台?什么编译器选项?(由于某些原因,堆栈没有展开。这可能是因为您没有指定平台所需的编译器选项。)啊,我明白了,出于某种原因,我在脑海中想,您需要调用
pthread\u exit()
,因此产生了混乱。经过测试,它解决了这个问题。谢谢。除此之外,另一个可能的泄漏源是,如果pthread被创建为一个可连接线程(默认),那么一个线程会一直保留资源(通常是整个线程堆栈),直到有人在该线程上调用pthread_join(),所以请确保该线程是一个分离的线程,或者确保有人在该线程上调用pthread_join()。
void* function(void* data){

    {
    std::vector<double> variable (100,1.2345);

    //do contents of thread
     }

    pthread_exit(NULL);
}