我有一个正在运行的线程(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/

10-10 01:12
查看更多