Stiamo aggiornando da VC8 a VC10 e abbiamo trovato un numero di perdite di memoria che sembrano essere correlate a CDialog. L'esempio più semplice di questo è dimostrato con il seguente codice che utilizza un CDialog che ha solo un numero di pulsanti. In questo VC10 perdite, ma in VC8 non è così:Perdita di memoria CDialog in VC10
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
delete dialog;
}
utilizzo della memoria continua a salire e la finestra di esempio che abbiamo con circa 30 bottoni perdite 10s di Mb.
Si noti che quanto sopra è un esempio di prova in cui abbiamo eliminato tutto il codice di gestione della finestra di dialogo, nel nostro codice reale abbiamo una classe derivata e si utilizza PostNcDestroy().
Stranamente nessuno dei seguenti esempi di codice di perdite sia in VC8 o 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;
}
Quello che ci manca qui?
Solo per curiosità - Perché avete bisogno di 1) Creare ' CDialog' in heap, 2) Crea 5000 dialoghi, 3) Non usare 'ShowDialog' o' DoModal'? – Ajay
Penso che l'interrogante stia facendo una domanda su un problema specifico con finestre di dialogo non modali e abbia semplicemente fornito un codice ridotto per spiegare il problema che ha visto: "Si noti che quanto sopra è un esempio di prova ...". Sospetto che il 5000 sia un numero arbitrario usato solo per enfatizzare i sintomi. – Nick
Per rispondere: Il codice è un test che chiunque può collegare a un'app di Windows e testare con una delle proprie finestre di dialogo. I nostri dialoghi non sono modali, ma vengono cancellati e ripuliti quando l'utente li chiude. Il nostro problema con questo non è solo la perdita di memoria, male com'è, ma anche il fatto che se si fa il ciclo il tempo diventa sempre più lungo a ogni iterazione. – lilburne