gpt4 book ai didi

c++ - "Private memory"尽管对象被破坏,但捕获 bad_alloc 后未释放

转载 作者:行者123 更新时间:2023-11-28 01:56:34 24 4
gpt4 key购买 nike

对象试图分配比允许的虚拟地址空间更多的内存(在 win32 上为 2Gb)。 std::bad_alloc 被捕获并释放对象。进程内存使用率下降,进程应该继续;但是,任何后续内存分配都会因另一个 std::bad_alloc 而失败。使用 VMMap 检查内存使用情况显示堆内存看似被释放,但实际上它被标记为私有(private),没有留下可用空间。唯一要做的似乎是退出并重新启动。我会理解碎片问题,但为什么进程在释放后不能收回内存?

该对象是 QListQList。该应用程序是多线程的。我可以制作一个小型复制器,但我只能复制一次问题,而大多数时候复制器可以再次使用释放的内存。

Qt 是在偷偷摸摸地做些什么吗?或者是 win32 延迟了发布?

最佳答案

据我了解您的问题,您正在从堆中分配大量内存,但有时会失败。将内存释放回进程堆并不一定意味着堆管理器实际上释放了仅包含堆空闲 block 的虚拟页面(由于性能原因)。因此,如果您尝试直接分配虚拟内存(VirtualAllocVirtualAllocEx),尝试会失败,因为几乎所有内存都被堆管理器占用,而堆管理器无从知晓关于您的直接分配尝试。

好吧,你可以用它做什么。您可以创建自己的堆 (HeapCreate) 并限制其最大大小。这可能非常棘手,因为您需要说服 Qt 使用这个堆。

分配大量内存时,我建议使用 VirtualAlloc 而不是堆函数。如果请求的大小 >= 512 KB,堆管理器实际上使用 VirtualAlloc 来满足您的请求。但是,我不知道当您释放该区域时它是否真的释放页面,或者它是否开始使用它来满足其他堆分配请求。

关于c++ - "Private memory"尽管对象被破坏,但捕获 bad_alloc 后未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com