int main() { CA * pa1 = new
CA(1.5); CA * pa2 = new
CA(2.75);
} 上述對(duì)象將共享同一 vtbl(虛表指針,), 指向同一虛函數(shù)表
![]()
如CreateDevice()返回接口指針,這些接口及其占用內(nèi)存什么時(shí)候釋放,要通過“引用計(jì)數(shù)”的技術(shù)來解決。AddRef()給這個(gè)接口指針的計(jì)數(shù)加1,而Release()會(huì)將之減1.一旦減到0,表示沒有客戶使用了,相關(guān)的接口就釋放了。 由此可知,每次調(diào)用Rlease()后,并不一定會(huì)釋放內(nèi)存,而是當(dāng)引用計(jì)數(shù)歸0時(shí)釋放內(nèi)存
com 更類似于在某次社交聚會(huì)上同某人會(huì)面,而與對(duì)他們進(jìn)行工作面試有很大的不同,當(dāng)進(jìn)行工作面試時(shí),被試者將提交一份介紹他們情況的個(gè)人簡歷,這份 個(gè)人簡歷類似于c++ 類的定義,而當(dāng)在社交聚會(huì)上會(huì)面時(shí),沒有人會(huì)給對(duì)方提供個(gè)人簡歷。為了了解對(duì)方的情況,必須向它們提問,著一點(diǎn)是類似于com 組件的。
第四章 引用計(jì)數(shù)
com 更類似于在某次社交聚會(huì)上同某人會(huì)面,而與對(duì)他們進(jìn)行工作面試有很大的不同,當(dāng)進(jìn)行工作面試時(shí),被試者將提交一份介紹他們情況的個(gè)人簡歷,這份 個(gè)人簡歷類似于c++ 類的定義,而當(dāng)在社交聚會(huì)上會(huì)面時(shí),沒有人會(huì)給對(duì)方提供個(gè)人簡歷。為了了解對(duì)方的情況,必須向它們提問,著一點(diǎn)是類似于com 組件的。 第四章 引用計(jì)數(shù) CoCreateInstace 某個(gè)特定的類廠將創(chuàng)建只同某個(gè)特定的CLSID相應(yīng)的組件 CoCreateInstance 創(chuàng)建的組件實(shí)際上是通過IClassFactory來創(chuàng)建的 CoGetClassObject( CLSID & clsid, DWORD ; CONSERVERINFO* const IID, void **ppv; ) 這兩個(gè) 最大的區(qū)別是 : CoGetClassObject 返回的是 指向所需組件的類廠而不是指向組件本身的一個(gè)指針,客戶可以通過用CoGetClassObject所返回的指針來創(chuàng)建所需的組件, 這個(gè)指針通常是一個(gè)IClassFactory 指針 HRESULT CoCreateInstance(CLSID &clsid,IUnKnwn *pUnkOuter,DWORD dwClsContext,IID &iid,void ** ppv) { *ppv=NULL; IClassFactory *pIFactory=NULL; HRESULT hr =::CoGetClassObject(clsid,dwClsContext,NULL,IID_IClassFactory,(void **)&pIFactory); if(SUCCEEDED(hr)) { hr=pIFactory->QueryInterface(iid,ppv);
pIFactory->Release(); } return hr; }
|
|