如果不这样做,在Unix中分配的共享内存会自动销毁吗?
例如,一个进程创建了该段,另一个进程使用了该段。现在他们因某种原因都崩溃了,那个段是否导致内存泄漏?
答案 0 :(得分:4)
一般不会。
如果你正在使用SysV共享内存(例如,shm_open
),那么没有。所有SysV IPC原语都不能自我清理;你必须明确地清理它们,或者用ipcrm
手动清理它们。这是我强烈反对使用它们的几个原因之一。
如果您mmap
ping一个文件以获取共享内存,那么该文件显然不会自行消失。与任何其他文件一样,您必须明确unlink
它才能让它消失。如果你已经这样做了,那么你就已经完成了。
答案 1 :(得分:1)
这取决于您为细分受众群提供的持久性。根据经验,如果你通过shm_open
(或一个键)给它起一个名字,它将是持久的。因为这表明它会在您关闭创建它的进程后继续存在,除非您以某种方式“删除”它,否则执行shm_unlink
。这是您可以在完全不同的流程之间共享细分的唯一方法。
所以,如果你这样做,你真的必须小心清理。这种持久段的最佳策略是让所有进程最初打开一个文件描述符,然后在每个人连接后立即取消链接。该段将一直存在,直到关闭它的最后一个文件描述符。
可以使用mmap
直接匿名映射非持久性细分。当你的过程不复存在时,它们就会消失。
答案 2 :(得分:0)
没有。应明确丢弃已分配的共享内存段。
有用的命令行工具,用于列出碎片内存段并删除:
ipcs
和ipcrm
。
最后一个可以用于前。当所有使用它的程序崩溃时删除一个段。