[ glorius @ 11.09.2008. 16:52 ] @
Postoji jedna stvar kod mehanizma reference countera koja, za sada, za mene predstavlja misteriju.

Posto radim u DirectX-u, uzecu primer objekata iz tog API-ja mada je verovatno sve isto kao i kod drugih COM objekata.

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;



Nikako ne mogu da provalim sta se desava.

Da li operator jednako ( ovo su, ipak, pointeri tako da sumnjam ) uvecava ref. counter za 1?

Video sam neki primer gde se samo ovako radi a i drugi koji izgleda ovako:

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;
pDevice1->AddRef();

.
.
.

pDevice2->Release();



Sta se ovde desava i sta je pravo resenje?
[ mmix @ 11.09.2008. 17:13 ] @
Ne povecava automatski, mada postoji ATL wrapper koji to moze da odradi za tebe (CComPtr<T>)

Neko koser resenje je da kad god napravis kopiju interfejsa pozoves AddRef() nad novim pointerom i Release() kad zavrsis sa njim, cisto zbog svoje preglednosti koda. Posto je pDevice1 == pDevice2, sve jedno je "ciji" AddRef() pozoves posto oba pokazuju na isti COM objekat. Dok god pazis na scope i osiguras se da za svaki AddRef() ide jedan Release() i da kad refcnt dodje na 0 nemas "zivih" pointera, sve je ok
[ kiklop74 @ 11.09.2008. 17:18 ] @
Citat:
glorius: Postoji jedna stvar kod mehanizma reference countera koja, za sada, za mene predstavlja misteriju.

Posto radim u DirectX-u, uzecu primer objekata iz tog API-ja mada je verovatno sve isto kao i kod drugih COM objekata.

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;



Nikako ne mogu da provalim sta se desava.

Da li operator jednako ( ovo su, ipak, pointeri tako da sumnjam ) uvecava ref. counter za 1?


Ne. Ovo jesu samo obicni pointeri. Da bi dobio automatiku za automatsko povecavanje referenci treba da koristis neke od refcounted com pointer klasa. Na primer _com_ptr_t.

Citat:
glorius:
Video sam neki primer gde se samo ovako radi a i drugi koji izgleda ovako:

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;
pDevice1->AddRef();

.
.
.

pDevice2->Release();



Sta se ovde desava i sta je pravo resenje?


Nema ovde pravog ili pogresnog resenja. Sve zavisi sta se zeli postici. Dodavanje referenci na com pointer implicira da dati proces zeli da se osigura u validnost pointera tokom njegovog koriscenja.

Kada se instancira bilo koji com interfejs on automatski ima refcount 1. Posto je moguce da se jedna te ista instanca com interfejsa koristi u razlicitim mestima u nekom programu pa cak i u razlicitim threadovima jedini nacin da se garantuje validnost ovog objekta je da se uvecava refcount. Refcount pokazuje na koliko "mesta" se trenutno koristi instanca objekta. To takodje znaci da dok je refcount > 0 interfejs ce biti validan.