我正在运行一个长期运行的C ++应用程序,它分配不同的对象并将其存储在几个双端队列和映射中,并且一次从这些数据结构中释放这些对象。我经历了少量的内存增加(我一天一天运行内存泄漏检测器(valgrind),但我无法发现任何可疑的内存泄漏。 我想知道问题是否与deque和存储对象的地图有关。 一旦从数据结构中弹出对象,deque和map的内存是否会将内存释放到OS? 任何人都可以指出解决方案或内存增加的一般可能原因吗?
答案 0 :(得分:6)
C ++标准不保证删除会释放内存到操作系统。事实上,许多标准C ++库都没有这样做。如果您希望将内存发布到操作系统,则必须使用操作系统自己的内存分配例程。
标准C ++库提供自定义分配器,可以帮助您实现此目的。
答案 1 :(得分:1)
您可能会遇到堆碎片。
如果分配不同大小的内存块,则可能意味着大内存块最终会被分成更小的块并变得无法使用。例如:
<xsl:template name="main">
<xsl:stream href="big-input.xml">
<xsl:for-each select="/*/partition" saxon:threads="50">
<xsl:sequence select="f:process-one-partition(copy-of(.))"/>
</xsl:for-each>
</xsl:stream>
</xsl:template>
大块free
印章malloc
&#39; d不再足够大,因此运行时从操作系统请求新的1 MB块如果这种情况持续数天,你可能会得到大量免费的0.99 MB块,但是每次需要时,运行时仍然需要从操作系统获得一个新的1 MB块。