我遇到了一些内存分配问题,并尝试检测这些问题的可能原因。
有许多可能的原因,并且必须花费大量时间来检查每个原因。
可能的原因之一是在线程内分配了一个内存缓冲区,并且在线程终止后使用该缓冲区。
因此,如果线程终止有可能导致内存释放,那么可以避免许多小时的调试。
非常感谢您提前。
我遇到了一些内存分配问题,并尝试检测这些问题的可能原因。
有许多可能的原因,并且必须花费大量时间来检查每个原因。
可能的原因之一是在线程内分配了一个内存缓冲区,并且在线程终止后使用该缓冲区。
因此,如果线程终止有可能导致内存释放,那么可以避免许多小时的调试。
非常感谢您提前。
我认为不会,尽管它当然可能取决于您的具体细节。
通常,从操作系统的角度来看,内存分配是每个进程的活动,而线程存在于进程内部。因此,如果一个线程分配了内存然后死掉了,操作系统不会清理它,因为该进程还活着。内存在进程内部是共享的,因此操作系统无法知道该内存不再被使用并且可以被清理。
不,“死”的线程不会释放任何内存。
当一个线程结束时,线程本身就会从内存中消失,就像一个函数执行完后一样。它会带走所有的“堆栈”对象,但您自己分配的所有内存(即 malloc)仍然存在。
因此,在结束线程之前,应确保已正确释放线程使用且不再需要的所有动态内存。
除了所有答案之外,我还想说明pthread有一个 TLS 密钥,这些密钥已在pthread_key_create中注册,它接受密钥 ID 和析构函数。在pthread_exit上,调用静态pthread_key_clean_all()迭代键并调用分配的析构函数,这些析构函数可以执行内存释放(通过应用程序设计)。
因此,要理解这一点 - 在您的代码中搜索所有pthread_key_create调用,检查是否分配了析构函数并将断点放置到所有这些调用中,以检查销毁的内容和顺序。
线程分配的内存行为类似于方法调用分配的内存:
当线程结束时,线程堆栈上的任何内容(例如局部变量)都将变为无效。但是,如果数据在堆中,那么只要进程在运行,内存就仍然有效。当然,您需要将指向该堆分配的指针保存在该线程之外的某个位置。