Newsgroup: it.comp.programmare.win32
Titolo: MFC

Salve a tutti.
Sto cercando di capire come funzionano internamente le MFC; come spunto ho
preso uno dei primi esempi dal libro di Prosise (hello MFC). Vi sono due
classi, CMyApp derivata da CWinApp e CMainWindow derivata da CFrameWnd. In
particolare, nella CMyApp::InitInstance() viene allocata dinamicamente una
istanza di CMainWindow, mediante l'operator new sovraccaricato in CFrameWnd
(e di conseguenza anche il delete sarà sovraccaricato), ed assegnato al
membro m_pMainWnd. Il problema è che non riesco a capire dove venga chiamato
l'operator delete su m_pMainWnd, e sicuramente la memoria viene deallocata
in qualche modo, perchè anche debuggando non mi viene segnalato nessun
memory leak nella debug window.
Qualcuno può rispondere al quesito?
Ciao e grazie.

 wrote in message
news:%OZEa.73035$
Ny5.2...@twister2.libero.it

Utilizzando il potente sistema di debug (sotto il 
menu Build - Start Debug)
si può percorrere un programma passo per passo.
In pratica vengono richiamate le funzioni riportate nella cartella
..\\VC98\MFC\SRC che sono ampiamente, se installate con Visual Studio,
consultabili proprio per questo tipo di esigenze, cioé per capire 
come funzionano le MFC internamente.
Già i titoli sono autoesplicativi, p. es. Winmain.cpp.
Inoltre quei sorgenti sono una fonte molto ricca di soluzioni,
anche da copia/incolla!
JJ
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

anche da copia/incolla!
Ciao,
sei in grado di consigliarmi un ottimo testo esplicativo sulle MFC
visto che il "Programmare windows con MFC" e' ormai introvabile.
grazie

 ha scritto nel messaggio
news:qtk9ev49aj9g07o7h...@4ax.com...

Non credo sia introvabile: su 
www.gorilla.it
 danno in ristampa la versione
in italiano, e da ordinare quella in inglese. Se non ti fa paura l'inglese
ti consiglio amazon. Tieni presente che per ordinare su amazon devi avere la
carta di credito, su gorilla invece puio ordinare anche in contrassegno, ma
i tempi son più lunghi.
Se cerchi altri testi, prova su 
www.accu.org
 , le review in genere sono
molto attendibili.
Ciao


Hai toccato uno dei punti più intricati di MFC e di qualsiasi altro 
eventuale framework per Windows basato sul c++.
Di solito una finestra viene creata in una parte ben determinata del 
codice scritto dall'utente (del framework); ma viene distrutta quando 
l'utente (del programma) clicca sul bottone di chiusura.
Gestire tutto questo non è assolutamente banale, la delete sta nel 
codice del framework che viene chiamato in risposta al messaggio di 
chiusura della finestra. Se poi a questo aggiungi la garanzia che tutto 
sia (più o meno) thread safe, la complicazione aumenta a dismisura.
Certo si ha il fatto poco elegante che la new sta in un posto (codice 
programma) e la delete in tutt'altro (codice framework).


Ti ringrazio per la risposta, comunque sono tutte cose che sapevo già: il
problema è che anche usando il debugger non riesco a trovare la parte di
codice in cui viene fatto il delete sul m_pMainWnd, che è dichiarata nella
classe CWinThread da cui deriva CWinApp. Sono riuscito solo a trovare il
punto in cui viene impostato a NULL, ma nessuna traccia della deallocazione.
Possibile che non venga proprio effettuata?
Ciao

 programma) e la delete in tutt'altro (codice framework).
Però nulla mi vieta di gestire direttamente la chiusura dell'applicazione
sovraccaricando ExitInstance, e anzi mi sembra anche l'unico posto in cui
potrebbe essere messa la delete.
Ciao

 Ciao
Forse ti può aiutare il fatto di sapere che l'ultimo messaggio che
Windows invia quando si sta distruggendo la finestra è WM_NCDESTROY.
La funzione interessata è OnNcDestroy ma la vera distruzione
dell'oggetto (finestra) dovrebbe avvenire nella funzione virtuale
PostNcDestroy chiamata dalla classe base di OnNcDestroy.
(by Kruglinski)
Riporto uno spezzone di verifica preso dal sorgente BARCORE.CPP
void CControlBar::PostNcDestroy()
{
  if (m_bAutoDelete)  // Automatic cleanup?
  delete this;
}
Altri esempi espliciti non so se si trovano.
Probabilmente sono ben nascosti nel codice del framework.
Con beneficio di inventario...


 (by Kruglinski)
Credo di aver capito, grazie anche a te: nella CWnd::OnNcDestroy viene
impostato a NULL il puntatore alla finestra, m_pMainWnd, che poi è anche
quello che ero riuscito a trovare io. L'area puntata da m_pMainWnd è però la
stessa puntata da this, per cui la deallocazione vera e propria viene
effettivamente eseguita da PostNcDestroy, come avevi detto tu.
Certo comunque che è strano come procedimento, e soprattutto mi sembra
strano che non ne venga fatta menzione nel Prosise.
Grazie ancora, e ciao