在线程终止之后,在线程中分配的内存是否存在?

时间:2012-10-17 12:56:44

标签: c multithreading memory-management

我遇到了一些内存分配问题,并尝试检测这些问题的可能原因。

有许多可能的原因,必须花费大量时间来检查每一个原因。

可能的原因之一是有一个内存缓冲区,它在一个线程中分配,并且在该线程终止后使用该缓冲区。

因此,如果线程终止有可能导致内存释放,那么可以避免多个小时的调试。

非常感谢你。

5 个答案:

答案 0 :(得分:3)

我认为不会,但它当然可能取决于您的具体细节。

通常,从操作系统的角度来看,内存分配是每个进程的活动,而线程在内部进程中存在。因此,如果一个线程分配内存然后死掉,操作系统就不会清理它,因为进程仍处于活动状态。内存在进程内共享,因此操作系统无法知道内存不再使用且可以清理。

答案 1 :(得分:1)

不,线索“死”'不要释放任何记忆。

当一个线程结束时,线程本身就会从内存中消失,就像函数执行完毕一样。这将需要所有的堆栈'带有它的对象,但你自己分配的所有内存(即malloc)仍将存在。

因此,在结束线程之前,应该确保线程使用并且不再需要的所有动态内存都可以正常释放。

答案 2 :(得分:0)

当线程结束时,线程的堆栈(例如,局部变量)上的任何内容都将变为无效。但是,如果数据位于中,则只要进程正在运行,内存仍然有效。当然,您需要将指针保存到该线程之外的某个堆分配。

答案 3 :(得分:0)

线程分配的内存的行为类似于方法调用分配的内存:

  • 当方法返回(线程终止)
  • 时,堆栈上的变量将被处理
  • 除非明确解除分配,否则将继续分配堆上的变量。

答案 4 :(得分:0)

除了所有答案之外,我还要注意 pthread 有一个TLS密钥,这些密钥注册了 pthread_key_create ,它接受密钥ID和析构函数。在 pthread_exit 上调用一个静态 pthread_key_clean_all(),它遍历键并调用可能执行内存释放的已分配析构函数(通过应用程序设计)。
因此,要理解这一点 - 在代码中搜索所有 pthread_key_create 调用,检查是否已分配析构函数并将断点放到所有这些调用中以检查销毁的内容和顺序。