- 主题:共享内存中的内存泄露
一个process从共享内存中申请了一块内存,但是突然死机,系统直接杀掉process,所有析构函数都没有调用,所以shared_ptr, unique_ptr都没用。如果是私有内存,系统自动释放内存,但是共享内存系统不会自动释放。这种内存泄漏怎么解决?
--
FROM 220.191.38.*
"从共享内存中申请了一块内存"是什么意思?
1)是该进程调用create file mapping这样的系统api创建了一块共享内存吗?这种情况,进程退出的时候资源会全部释放,包括共享内存
2)还是另一进程创建了一块共享内存,而当前进程从这块共享内存占用了一块来使用?这种情况需要自己设计数据结构来跟踪使用共享内存的进程,并定期扫描确定进程是否处于活动状态
【 在 ziqin 的大作中提到: 】
: 一个process从共享内存中申请了一块内存,但是突然死机,系统直接杀掉process,所有析构函数都没有调用,所以shared_ptr, unique_ptr都没用。如果是私有内存,系统自动释放内存,但是共享内存系统不会自动释放。这种内存泄漏怎么解决?
--
FROM 123.112.16.*
情况2
问题是,就算知道了对方挂了,怎么知道对方占用了哪块内存?就算设计了数据结构,又不能保证申请内存+跟新结构 这个操作是原子的
【 在 Bernstein 的大作中提到: 】
: "从共享内存中申请了一块内存"是什么意思?
: 1)是该进程调用create file mapping这样的系统api创建了一块共享内存吗?这种情况,进程退出的时候资源会全部释放,包括共享内存
: 2)还是另一进程创建了一块共享内存,而当前进程从这块共享内存占用了一块来使用?这种情况需要自己设计数据结构来跟踪使用共享内存的进程,并定期扫描确定进程是否处于活动状态
: ...................
--
FROM 115.193.190.*
内存块是可以打开啊,但是对方在块上类似new了一块,然后挂了,也没存new出来的是哪一块,怎么办?
【 在 gameplayer 的大作中提到: 】
: shmget和shm_open都可以获取到之前创建的共享内存块,注意看手册,比如shm_open的
: 手册:
: shm_open() creates and opens a new, or opens an existing, POSIX shared memo
: ...................
--
FROM 115.193.190.*
那是更细的粒度,就必须增加更细的跟踪信息才行,也就是一大块内存中的某一小块是谁占用了。
【 在 ziqin 的大作中提到: 】
: 内存块是可以打开啊,但是对方在块上类似new了一块,然后挂了,也没存new出来的是哪一块,怎么办?
:
--
FROM 222.130.138.*
不能保证申请内存+跟新跟踪结构 这个组合操作是原子的
【 在 gameplayer 的大作中提到: 】
: 对,加上pid后,可以在进程启动获取到共享内存时检查是否有“泄漏”的内存,这样对
: 正常运行影响较小
:
: ...................
--
FROM 115.193.190.*
都说了,不能保证跟 new+更新跟踪信息 是原子的
--
FROM 115.193.190.*
那就改成原子的呗
街上没摄像头,也没目击证人,地上也没物证,你要咋破案?
【 在 ziqin 的大作中提到: 】
: 都说了,不能保证跟 new+更新跟踪信息 是原子的
--
修改:z16166 FROM 222.130.138.*
FROM 222.130.138.*
你这个需求跟操作系统的内存分配器是一样的,实现也是类似呗
【 在 ziqin 的大作中提到: 】
: 情况2
: 问题是,就算知道了对方挂了,怎么知道对方占用了哪块内存?就算设计了数据结构,又不能保证申请内存+跟新结构 这个操作是原子的
--
FROM 115.171.245.*
这些都得自己考虑,相当于自己设计一个基于共享内存的进程间通讯库
【 在 ziqin 的大作中提到: 】
: 情况2
: 问题是,就算知道了对方挂了,怎么知道对方占用了哪块内存?就算设计了数据结构,又不能保证申请内存+跟新结构 这个操作是原子的
:
--
FROM 123.112.16.*