我们正在从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;
}
Run Code Online (Sandbox Code Playgroud)
内存使用率不断上升,我们使用大约30个按钮的示例对话框泄漏了Mb的10s.
请注意,上面是一个测试示例,我们已经删除了所有对话框处理代码,在我们的实际代码中,我们有一个派生类并使用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;
}
Run Code Online (Sandbox Code Playgroud)
我们在这里失踪了什么?