2009-07-22 51 views
0

我創建了一個名爲Test.dll的COM組件,其中我創建了一個接口IDiscover。通過以下兩種方式分配指針對象有什麼區別?

現在我來分配內存的2種方式作爲

IDiscoverPtr id(__uuid(TestClass)); and Test::IDiscover *id=NULL; 

什麼是這兩者之間的differnce ....任何信息感激..

+0

你真的在第二個分配任何東西嗎? – EFraim 2009-07-22 05:52:15

回答

2

第一個是智能指針和第二個是一個正常的指針。

您不必擔心智能指針Releasing而您必須明確Release()正常COM接口指針。

有關智能指針的詳細信息,Look Here

除此之外,第一個將嘗試找到註冊表中的類名爲TestClass一個GUID,並會嘗試通過CoCreateInstance API調用來創建這個類的一個實例。它將嘗試通過所述CoCreateInstance調用獲得IDiscover接口指針,並且如果未能這樣做,將會引發錯誤。在成功執行線路IDiscoverPtr id(__uuid(TestClass));後,您應該在id中擁有有效的IDiscover接口指針。

第二個只是一個接口指針的聲明,沒有別的。你將不得不通過(大部分時間)CoCreateInstance或其中一個變體來實例化它。

1

第一個變種是智能指針,第二個變種是原始指針(普通指針)。當它自己超出範圍時,智能指針將調用連接對象的IUnknown :: Release()。原始指針不會這樣做,除非您在適當的時刻明確調用了conected對象的IUnknown :: Release(),否則可能會發生內存泄漏。

第一個變體將嘗試實例化COM對象在自己的構造(因爲您使用帶有類ID的參數化構造函數)並拋出異常(如果無法完成)。有關詳細信息,請參閱_com_ptr_t(comip.h)的源代碼。第二個變體會給你一個初始化爲null的指針 - 沒有連接到任何對象。

COM對象的智能指針有一組成員函數,用於實例化對象和調用QueryInterface() - 這通常可以減少編寫所需的代碼量。使用原始指針時,必須使用一些參數調用CoCreateInstance(),其中大部分參數將設置爲默認值,這將強制您編寫更多代碼。請再次查看comip.h以獲取_com_ptr_t的完整源代碼 - 它們非常易讀。

一般的建議是使用智能指針,除非您有真正的理由不這樣做。

+0

因此,當使用__uuid(「」)時,我們不需要調用CoCreate()...。 – Cute 2009-07-22 07:23:21

相關問題