【发布时间】:2014-01-07 00:24:21
【问题描述】:
简介及相关资料:
我从事的原始项目有少量内存泄漏,因此我决定执行一个小测试,以便检测可能导致它们的原因。
我使用 Visual Studio 向导创建了一个 Win32 项目。
我没有添加任何内容,我只是将其保留为使用向导创建的。
我已经使用工具GDIView(http://www.nirsoft.net/utils/gdi_handles.html)查看是否有任何固有的GDI leaks。
问题:
每次我调整窗口大小时,此工具都会显示我的应用程序泄漏了 +3 个区域。
我为解决问题所做的努力:
由于该项目是由 Visual Studio 向导创建的,因此我尝试从头开始创建一个简单的项目,但出现了相同的 +3 区域。
阅读 CodeProject 上有关区域的一些文章,我偶然发现了一些演示应用程序的演示应用程序。
当我打开 GDIView 时,这些应用程序也会泄漏 +3 区域。
当我打开Task Manager 以查看是否真的发生了小内存泄漏时,所有这些都得到了验证——它确实发生了,因为内存略微上升并且之后保持不变 无论我调整窗口大小多少次。
我使用 Microsoft Visual Studio 2008 Express Edition,但在常规 Visual Studio 2008 中创建空项目时也检测到问题。
我在 Windows XP 上工作,但在 Windows 7 上也会出现同样的效果。
问题:
为什么会发生这种情况以及如何消除这些小的内存泄漏?
谢谢。
最好的问候。
【问题讨论】:
-
'之后保持不变' - 没问题。可能不是真正的泄漏。
-
您是否尝试过将您的应用程序构建为控制台子系统 exe,在末尾添加键盘输入(在事件循环和窗口破坏之后),然后检查 GDI 泄漏?如果代码是通常的 Microsoft 非标准
WinMain,那么对于此测试,您可能必须告诉链接器使用入口点winMainCRTStartup,或者将其更改为标准main。 -
@MartinJames 但它“戳”了我的眼睛,我希望以某种方式将其移除。甚至可以删除它们,还是它们是固有的?无论我做什么,到目前为止我发现并测试过的每个编写良好的 Win32 应用程序都有这 3 个漏洞。谢谢。问候。
-
@Cheersandhth.-Alf,不,我没有尝试过以这种方式构建它,但我愿意尝试。您能否提供一些有关如何执行此操作的示例的链接,因为我以前没有这样做过。谢谢。问候。
-
@AlwaysLearningNewStuff:抱歉没有链接(我必须把它写成博客文章)。但这很简单。首先检查您是否有
WinMain、wWinMain、main或wmainC++ 主函数。如果我没记错的话,对应的入口点(指定给链接器)是winMainCRTStartup、wWinMainCRTStartup、mainCRTStartup和wmainCRTStartup。您必须处理此问题的原因是 Microsoft 非标准的不合理行为(例如 g++ 没有此类问题)。因此,在链接器选项中,将“subsystem”设置为“console”,将“entry”设置为调用 C++ main 的入口点函数。添加 kbd 输入。构建。
标签: c++ winapi memory-leaks gdi