1

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

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

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

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

非常感谢您提前。

4

5 回答 5

3

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

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

于 2012-10-17T12:59:11.363 回答
1

不,“死”的线程不会释放任何内存。

当一个线程结束时,线程本身就会从内存中消失,就像一个函数执行完后一样。它会带走所有的“堆栈”对象,但您自己分配的所有内存(即 malloc)仍然存在。

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

于 2012-10-17T13:01:28.013 回答
0

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

于 2012-10-17T13:37:55.750 回答
0

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

  • 当方法返回(线程终止)时,堆栈上的变量将被释放
  • 除非显式释放,否则堆上的变量将继续分配。
于 2012-10-17T13:04:24.677 回答
0

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

于 2012-10-17T13:01:11.893 回答