[ Gile1999 @ 08.01.2002. 22:01 ] @
Nov sam u Visual C++ pa mi je potreban neki dobar tutorijal za doc/view programiranje. Takode me zanima zbog cega poinetre koje kreiram ne brisem (delete pPointer) posle koriscenja. MFC sam oslobada memoriju?
[ Dragi Tata @ 08.01.2002. 22:34 ] @
Za pocetak, pogledaj "Scribble tutorial" koji dobijas uz VC++. Kad to savladas, pogledaj:

http://www.codeproject.com/docview

a bogami i:

http://www.codeguru.com/doc_view/index.shtml

Tamo ima gomila primera za Doc/View

Sto se tice pointera pod MFC-om, pogledaj malo:

http://www.codeproject.com/gdi/drawtechniques.asp
[ leka @ 16.01.2002. 20:38 ] @
Hmm, vrlo cudno. Priznajem, ja nikada nisam, niti cu, programirao koristeci M$ MFC.
Siguran sam da svaki pointer koji kreiras sa new klauzulom mozes da obrises sa delete klauzulom...

Na kraju - ni M$ VC++ ne koristim, ali ovo sto sam gore rekao stoji i dalje i generalno (treba) da vazi za sve C++ kompajlere.
[ Milan Aksic @ 17.01.2002. 00:22 ] @
Jedino ako je pointer na kraju proga, i/ili nece opet biti koriscen (do kraja proga), nema potrebe brisati ga (mada nije na odmet) jer po zavrsetku programa, OS sam vraca memoriju sa slobodnog skladista.
[ Ivan Dimkovic @ 17.01.2002. 14:36 ] @
Citat:
Gile1999:
Nov sam u Visual C++ pa mi je potreban neki dobar tutorijal za doc/view programiranje. Takode me zanima zbog cega poinetre koje kreiram ne brisem (delete pPointer) posle koriscenja. MFC sam oslobada memoriju?



Hmm.. ko ti je rekao da ne brises pointere (to jest - da dealociras memoriju koju si zauzeo?) ?? Postoji vise nacina pristupa new/delete problemu, i obicno se izbegava visestruko koriscenje new/delete kombinacije ako se taj fragment koda izvrsava u petlji... prirodnije je da se ti pointeri alociraju pre izvrsavanja koda koji se ponavlja a dealociraju na kraju. U svakom slucaju se pointeri brisu na kraju, i NE TREBA ostavljati to operativnom sistemu da radi, jer ako koristis neke naprednije alatke (npr: NuMega BoundsChecker) one ce se buniti da tvoj kod pravi leakove.

E.. postoje neki pointeri u MFC-u koji se ne brisu, ja se ne secam (ni ja ne radim u MFC-u aktivno, tek ponekad nesto napisem) - mislim da je u pitanju CPaintDC pointer kada se nesto crta u prozoru, ali nisam bas siguran... u svakom slucaju, ono sto ti alociras sa new, se ocekuje da dealociras sa delete u nekom momentu...

[ Dragi Tata @ 17.01.2002. 19:09 ] @
Grafički objekti koje vraća funkcija CDC::SelectObject() su "privremeni", tj briše ih funkcija CWinApp::OnIdle() i ne treba ih brisati sa delete. Nije mi jasno zašto je to tako izvedeno.

Uglavnom, pravilo je da kreirane objekte NEKO mora da izbriše, inače imaš tzv "resource leaks". Takođe, dobra je praksa da ako izbrišeš neki pointer sa delete, posle toga postaviš njegovu vrednost na 0.
[ Milan Aksic @ 17.01.2002. 19:26 ] @
Rekao sam da moze (u odredjenim slucajevima, na kraju proga) a ne da to postane pravilo, koje moze dovesti do nepredvidjenih rezultata, od kojih je memory leak najpredvidljiviji.
[ Gile1999 @ 21.01.2002. 10:51 ] @
Uh,
dugujem vam objasnjenje. Radi se o sledecem kodu:

//hello.cpp

#include <afxwin.h>

// Declare the application class
class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

// Create an instance of the application class
CHelloApp HelloApp;

// Declare the main window class
class CHelloWindow : public CFrameWnd
{
CStatic* cs;
public:
CHelloWindow();
};

// The InitInstance function is called each
// time the application first executes.
BOOL CHelloApp::InitInstance()
{
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}

// The constructor for the window class
CHelloWindow::CHelloWindow()
{
// Create the window itself
Create(NULL,
"Hello World!",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Create a static label
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50,80,150,150),
this);
}

ceo tutorijal se nalazi na:

http://www.cse.iitb.ernet.in:8.../stuff/OSes/windows/MFC/2.html

A sada pitanje.
Gde se brise pointer "cs" kao i gde se kreira pokazivac "m_pMainWnd"???
[ Ivan Dimkovic @ 21.01.2002. 11:42 ] @
Citat:
Gile1999:
A sada pitanje.
Gde se brise pointer "cs" kao i gde se kreira pokazivac "m_pMainWnd"???


Ne ne .. to se ne brise, m_pMainWnd je kreiran od strane MFC frameworka pri kreiranju aplikacije i MFC framework ce ga i obrisati kada se aplikacija zatvori.

Brises samo ono sto si TI alocirao !

Znaci, ako si pointer dobio na drugi nacin osim new/malloc onda ga nemoj brisati sa delete/free.
[ Dragi Tata @ 22.01.2002. 22:10 ] @
Citat:
Gile1999:
Gde se brise pointer "cs" kao i gde se kreira pokazivac "m_pMainWnd"???


m_pMainWnd je deklarisan u klasi CWinThread iz koje je izvedena CWinApp, a iz nje je izvedena tvoja app klasa. Dakle, m_pMainWnd si "nasledio" od CWinThread.

Što se tiče "cs"-a, najpre da te pohvalim: odlično pitanje. Odgovor leži u funkciji PostNcDestroy. Naime, kada "zatvoriš" program, poslednja poruka koju svaki prozor (a i kontrole su prozori) primi je WM_NCDESTROY, koja je oobrađena MFC funkcijom PostNcDestroy, a ona pozove
Code:

 delete this;


Dakle, MFC vodi računa o tome, ali samo kada su u pitanju prozori.

Za više detalja pogledaj Microsoftov TN017: Destroying Window Objects
[ Dragi Tata @ 22.01.2002. 22:38 ] @
He, u stvari sam malo lupio. Priča o PostNcDestroy važi za m_pMainWnd, a ne za cs.