问题:
我写了一个程序,它有10到12个CListCtrls,行同时附加到这些行。
我从未删除过旧项目来限制listCtrls的行数,该程序已经运行了大约1天
我刚刚看到进程监视器,意识到内存使用量增加到600MB(最初大约是70~80MB)
我认为原因与CListCtrls有关。
问题:
我想把内存使用量减少到100MB左右。
所以,我想知道:
1.CListCtrl的行数是否有默认限制,多少
- 我听说CListCtrl有一个限制,所以不需要手动删除我的一个队友的热门项目
2.内存使用量会像删除前几项一样减少吗
- 我想知道CListCtrl保存的缓冲区数据与我们在UI上看到的相同,或者它只会像
std::vector
中那样增加缓冲区大小
3.如果CListCtrl不重新分配UI上删除的缓冲区,那么限制内存使用的解决方案是什么
-
或者问题的原因与CListCtrl无关
我将LVS_EX_DOUBLEBUFFER
与CListCtrls一起使用。 -
另一方面,我使用了10-12个文件映射进行日志记录,每个映射大约6MB。这些已经测试了很多时间,我相信没有内存泄漏。
如有任何答案或参考,我们将不胜感激,谢谢。
就像计算中的任何东西一样,不需要猜测。列表视图控件也不例外。没有默认限制,控件将尽职尽责地存储您向它抛出的所有数据,直到它耗尽系统资源。它不会试图猜测哪些数据可能是重要的或可丢弃的。
如果您需要限制列表视图控件所消耗的资源量,那就由您来决定了。您将不得不手动删除您知道不再相关的项目。响应于删除一个项,释放了多少内存(或者如果有的话)是一个实现细节。你无法控制这件事。
如果您需要这种控制,则必须解除列表视图控制,使其无法代表您管理内存。值得庆幸的是,控件为您提供了LVS_OWNERDATA
功能,允许您独立于控件管理后备内存,并且只告诉控件有多少项。
这通常被称为虚拟列表视图,您会发现如何实现它的无数示例,例如如何使用虚拟列表视图控件。
LVS_EX_DOUBLEBUFFER
扩展列表视图样式与这些样式无关。它只适用于渲染,并在系统资源方面增加了一次性的恒定开销。
我写了一个程序,它有10到12个CListCtrls,行同时附加到这些行。
一个具有10-12列的CListCtrl可能更适合这一点。
。。。内存使用量增加到600MB
为什么称之为problem
?这只是一个观察。是否向这些控件添加项目?有多少速度是多少?
您计划如何处理包含数千个项目的列表控件?滚动希望看到一些有趣的东西?
关键是,您可能会发现数据的可视化效果更好。
- CListCtrl的行数有默认限制吗?它有多少
控件使用int
作为项目编号,因此约为20亿。或者,作为IInspectable声明-当你耗尽资源时;以先到者为准。
- 是否会像删除顶部项目一样减少内存使用量
释放保存数据的内存时,内存使用率将降低。如果你在列表中添加字符串(而不是指向其他地方保存的数据的指针),那么是的,删除项目将释放内存。