基于链表的内存池内存泄漏问题:进程异常终止时的疑问
基于链表的内存池实现
class MemPool{ public: MemPool(int blockSize, int count); /*new a blockSize * count block then divide them into $count block store in m_blocks*/ ~MemPool(); /* iterate through m_blocks, and delete them */ void Alloc(); //get a block from m_blocks void Free(void*); //put a block back to m_blocks private: list<void*> m_blocks; }; MemPool poll(512, 10);
问题
若进程遭遇异常或被意外终止,不在m_blocks链表中的内存块是否会发生泄漏?该泄漏是否有影响?
回答
- 从操作系统层面来说,不会产生真正意义上的内存泄漏。当进程异常或意外终止时,操作系统会直接回收该进程占用的所有内存资源——不管这些内存是内存池未分配的(在
m_blocks链表中)还是已经分配出去的(不在链表中)。内存池初始化时通过new申请的整块大内存,以及拆分后分配出去的小内存块,都属于该进程的地址空间,进程结束后会被系统全部收回,不会残留占用系统资源。 - 从应用程序自身角度看,对于已经终止的进程来说,这些未放回链表的内存块没有任何影响——进程都已经退出,不存在内存资源持续占用的问题。只有在进程运行期间,未及时放回的内存块才会导致内存池内部的“逻辑泄漏”(即内存池无法复用这些块),但这种情况只会影响进程运行时的内存使用效率,一旦进程终止,就不存在后续影响了。
内容的提问来源于stack exchange,提问作者Searcher
相关产品推荐
相关产品推荐

