当我在iOS上执行pthread_cancel时,是否会释放堆中的内存?

时间:2011-02-18 09:13:09

标签: c++ c ios pthreads

假设我在后台线程中分配了一些内存,也就是说,线程堆栈正在保存指向该内存的指针。现在我想通过调用pthread_cancel来终止后台线程执行。这个记忆会被释放吗? (我的平台是iOS,编译器是gcc 4.2)

4 个答案:

答案 0 :(得分:3)

每个线程必然需要自己的堆栈;但是每个进程通常只有一个堆。线程被销毁时,没有自动机制来释放堆上分配的内存。你最终得到的只是内存泄漏。

作为一般规则,请避免使用pthread_cancel,因为很难确保pthread_cancel能够安全运行。而是建立一些机制,你可以将消息传递给线程来销毁自己(在释放它拥有的任何资源之后)。

答案 1 :(得分:0)

线程退出后,线程堆栈将被删除。但是没有任何进程或代码可以查看您的线程堆栈并释放您在堆上分配的对象的任何引用。此外,通常情况下,线程堆栈不包含对内存的任何引用,线程堆栈是一个独立的空间,它被赋予线程以用于通用程序堆栈,任何引用只会在堆栈上,只要你是在将此类引用推送到堆栈的函数内部,通常是因为您使用局部变量引用它。

答案 2 :(得分:0)

默认情况下,不 - 查看其他答案,这些答案更适合您寻求的答案。但是,有一个特定于线程的分配器;如果你正在使用它,你就会知道。

答案 3 :(得分:0)

不,它不会被自动删除或释放。如果你很幸运,如果你正在运行一个收藏家,它可能会被垃圾收集。文件句柄,共享内存ID,互斥锁等也不会被释放/解除分配。异步取消对于例如安全对仍由另一个线程拥有的数据进行纯数学计算,但一般来说风险很大 - 这就是为什么有些线程API已经完全试验并删除了该函数。