我们正在从 VC8 升级到 VC10,并且发现了一些似乎与 CDialog 相关的内存泄漏。最简单的示例是使用以下代码演示的,该代码使用只有多个按钮的 CDialog。在 VC10 中会泄漏,但在 VC8 中不会:
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
delete dialog;
}
内存使用量不断上升,我们有大约 30 个按钮的示例对话框泄漏了 10s 的 Mb。
请注意,上面是一个测试示例,其中我们剥离了所有对话处理代码,在我们的实际代码中,我们有一个派生类并使用 PostNcDestroy()。
奇怪的是,以下代码示例都没有在 VC8 或 VC10 中泄漏:
CDialog* dialog = new CDialog;
for (int i = 0; i < 5000; ++i) {
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
}
delete dialog;
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
delete dialog;
}
我们在这里缺少什么?