我們正在從VC8升級到VC10,並發現一些似乎與CDialog相關的內存泄漏。下面的代碼使用一個只包含多個按鈕的CDialog演示了最簡單的例子。在此VC10泄漏,但在VC8它並不:VC10中的CDialog內存泄漏
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
delete dialog;
}
內存使用量不斷上升和示例對話,我們有大約30按鈕泄漏MB的10秒。
請注意,以上是一個測試示例,我們已經剝離了所有對話處理代碼,在我們的真實代碼中我們有一個派生類並使用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;
}
什麼是我們在這裏失蹤?
- 爲什麼你需要1)創建' CDialog',2)創建5000個對話框,3)不使用ShowDialog或DoModal? – Ajay
我認爲提問者詢問無模對話的具體問題,並簡單地提供了一些簡化代碼來解釋他所看到的問題:「請注意,上面是一個測試示例...」。我懷疑5000是一個任意數字,只是爲了強調症狀。 – Nick
要回答:代碼是一種測試,任何人都可以插入Windows應用程序並使用自己的對話框進行測試。我們的對話恰好是無模式的,但是當用戶關閉它們時會被刪除和清理。我們的問題不僅在於內存泄漏,因爲這是壞的,而且還有一個事實,即如果您計算循環時間,每次迭代都會變得越來越長。 – lilburne