2012-08-24 119 views
1

之間的區別我不明白shared_ptr和C++/CX中新句柄符號(^)之間的區別。從我讀過的內容看,他們似乎在引用計數和內存管理方面做了同樣的事情。我錯過了什麼?std :: shared_ptr <Type>和Type^

std::shared_ptr<Type> 
//vs 
Type^ 
+0

由於'Type ^'語法不合適,刪除了[C++]和[C++ 11]標籤在語言的兩個版本中的任何一個導致明顯的答案:*不同之處在於一個是C++ 11構造,另一個不是* –

+4

@DavidRodríguez-dribeas:它看起來像t他的標籤沒有被刪除?無論如何,我傾向於保留標籤原樣。儘管'T ^'是一個C++/CX特性,'std :: shared_ptr '是一個C++特性,問題是詢問兩者。 –

+1

@JamesMcNellis:它看起來好像標籤沒有被移除,不是嗎? :)如果你認爲他們應該在那裏,我很好。我的理解(可能是由於明顯的無知)是因爲'std :: shared_ptr'在C++/CX中可用(即,問題不在於比較不同語言的功能,而是比較一種特定語言中可用的兩種功能。 –

回答

12

單獨考慮終身管理,這些都是一樣的:一個shared_ptr<T>擁有對T對象的強大(擁有)引用;一個T^也是這樣。 make_shared<T>大致相當於C++/CX中的ref new T

如果你到處看到T^你認爲shared_ptr<T>ComPtr<T>CComPtr<T>,那也沒關係 - 生命週期管理是大致相同的。

如何壽命管理工作引擎蓋下是不同的,雖然:每T類型爲其T^是公形成是實現IUnknown接口一個Windows運行時引用類型,所以T對象在內部參考計數(*)shared_ptr<T>支持任意類型並使用外部引用計數(即,它分配自己的引用計數機制來控制對象的生存期)。

對於弱引用,shared_ptr<T>weak_ptr<T>,並T^WeakReferenceWeakReference不是強類型的,但您可以輕鬆地在其周圍編寫強類型的引用包裝。否則,弱引用就像您期望的那樣工作。對弱引用的支持是可選的:並非所有引用類型都支持弱引用,但大多數都是。

(*)有一個例外:Platform::String^,它不是Windows運行時引用類型,但由於各種原因專門處理。不過,您可以將其視爲與生命週期管理方面的任何其他T^相同。


那麼,爲什麼Windows運行時類型在C++/CX中戴帽子?爲什麼不使用shared_ptr<T>ComPtr<T>這樣的庫解決方案?

這是因爲您從來沒有真正擁有指向具體運行時類型的指針(或帽子):只能通過指向其類型實現的某個接口的指針與對象進行交互。 Windows Runtime也不支持接口或類繼承:每個接口必須直接從IInspectable派生,並且通過使用COM聚合來模擬類繼承。

總之,沒有任何庫解決方案會導致自然的C++代碼與靜態類型安全。函數調用,派生到基礎轉換和接口轉換通常需要調用QueryInterface才能獲得正確的接口指針。

您可以使用庫解決方案(例如,參見WRL庫或幾乎任何COM代碼)執行此操作,但不能支持C++語言功能,如隱式轉換或dynamic_cast。如果沒有這些帽子,你就會陷入僅僅處理接口指針而不得不自己致電QueryInterface


(如果你有興趣在背後的理由,爲什麼的C++/CX語言擴展,開發和C++/CLI語法如何最終被選取爲重複利用,我就建議吉姆·斯普林菲爾德的職務這個博客從去年開始,"Inside the C++/CX Design"。另外值得注意的是episode 3 of GoingNative,其中Marian Luparu在討論C++/CX。)

+1

真是一個很好的答案......非常感謝James。 – psousa

+0

@James McNellis謝謝.Springfield的帖子在研究我的C++背景應該如何適用於開發針對RT的應用時很有用,但這樣的自發答案對於掌握非常有幫助抓住新的平臺。 –

1

至於我可以告訴大家,因爲後者缺乏對 弱引用和 定製釋放函數的支持。

請注意,前者更普遍,接受任何類型(原則上),以及安全和清潔要求使用助手功能make_shared。後者在語言層面得到支持。這意味着這樣的代碼是C++/CX安全:

some_function(ref new foo(), ref new bar()); 

雖然在C++中,你需要這樣做:

// bad: if foo is allocated but bar's allocation throws, you leak! 
some_function(new foo(), new bar()); 

// good: both never make it anywhere but into a shared_ptr, no leaks 
some_function(make_shared<foo>(), make_shared<bar>()); 

其它,當然,他們實現了相同的概念。如果你在C++/CX領域,使用後面的語法來簡化和一致;如果您試圖堅持使用標準C++,或者將現有的資源管理方案封裝爲引用計數方案,那麼您就需要前者。

+1

C++/CX has'WeakReference'。[更多] [在MSDN上](http://msdn.microsoft.com/en-us/library/windows/apps/hh699859.aspx)。 –

+0

@JamesMcNellis:哦,非常好!我應該已經搜索了更多 – GManNickG

相關問題