我有一个正在运行的线程(OS X 10.10.5)与此堆栈跟踪挂起。大约运行 20 小时后,可能与内存不足有关。但是,问题是,为什么 malloc 不只返回 null?为什么线程的执行需要暂停?请求的实际字节数很小(对于路径上的字符串操作)。
std::wstring finalPath = itsPath.substr(0,ls+1);
1 operator new(unsigned long) + 37 (libc++abi.dylib + 124485) [0xa0339645] 2
1 malloc + 29 (libsystem_malloc.dylib + 3997) [0xa1829f9d] 2
1 malloc_zone_malloc + 116 (libsystem_malloc.dylib + 7243) [0xa182ac4b] 2
1 default_zone_malloc + 3 (libsystem_malloc.dylib + 67909) [0xa1839945] 2
*1 thread_exception_return + 0 (kernel + 632362) [0xffffff800029a62a] (runnable) 2
失败的操作的目的是清除一个临时目录,这样引导盘就不会被程序生成的临时文件填满。这个过程失败了,磁盘确实填满了,线程停止了(就像真的停止了一样,主线程加入了它),从磁盘上删除文件的过程也停止了。此外,由于线程停止,必须终止进程。我不知道您是否可以准确地将其称为错误,因为失败的过程是为了防止实际发生的事情。
谢谢你的见解。
最佳答案
您提到磁盘已满,因此内核可能正在尝试将内存换出到磁盘并失败。在这种情况下,macOS 会挂起,而不是终止失控的进程。这个想法是您释放一些空间和/或关闭一些其他应用程序,然后恢复暂停的进程,例如使用 kill -CONT <PID>
。
听上去,真正的问题是你分配了太多的内存,或者内存泄漏。
关于c++ - 为什么 malloc 不返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43876025/