2013-05-27 55 views
1

當我們創建從類型庫例如對象堆

SomeClassPtr some_obj(__uuidof(SomeImplementation)); 

對象是some_obj在堆上創建或疊加麼?我的意思是像

SomeClassPtr *some_obj = new SomeImplementation(); 

回答

1

在這種情況下,你的「指針」(SomeClassPtr)指向的內存塊,這將是堆分配。

然而,這並不一定執行堆分配,因爲它實際上是一個參考計數類型,其(通過IUnknown::AddRefIUnknown::Release)處理分配和解除分配。這意味着它可能會獲取並遞增先前分配的對象的引用計數,具體取決於存儲在COM指針中的類型。

5

錯誤的思考方式。不是堆棧。

但這就是猜測結束的地方。這個COM對象可以存在於不同的進程中。或者在世界各地的一臺機器上。你得到的只是一個界面指針,它指向你不知道的地方。可能是在堆上分配的實際對象。可能是與其他地方的存根交談的代理。其他地方。這是一個功能,避免關心它。

+0

那麼它有沒有機會超出方法的範圍? – MistyD

+0

您的*參考*可能超出範圍而沒有解除分配對象的實例*,反之亦然;根據對象的引用的生命週期和對象本身的生命週期來思考。 –

+0

這不是一個非常有意義的問題。東西停在方法的最後一個大括號處。如果你沒有在接口指針上調用Release(),也沒有將它存儲在某個地方,以便稍後使用它,那麼你會泄漏內存。某處。 –

0

其實,它比這個更有點兒。

嚴格地說,第一個例子是一個堆棧變量,而第二個例子是一個堆變量(假設新的處理不當被覆蓋。

的怪異部分是因爲,通過COM的本質,你不知道什麼或在哪裏或者如果(如果結果是一個AddRef,例如可能沒有)發生任何其他分配;特別是對於需要跨越線程/進程邊界的分配(這將始終是出錯的情況),IMalloc :: Alloc(CoTaskMemAlloc())的默認實現是從COM對象實際創建/實例化的進程的堆中分配的。

As在其他地方指出,這是一個特點;你不需要關心。