2016-03-21 79 views
0

我正在使用智能指針或ComPtr。我正在使用它與我的directX應用程序,我還沒有看到其他人使用ComPtr在其代碼中調用release函數。那麼智能指針會釋放智能指針所指的數據,還是需要手動執行?我不知道這是否能讓你知道,如果不這樣做,我會以更好的細節作出迴應。我是否必須使用ComPtr調用釋放函數?

+0

ComPtr:「創建一個智能指針類型,它表示由模板參數指定的接口.ComPtr自動維護底層接口指針的引用計數,並在引用計數爲零時釋放接口。源MSDN:https://msdn.microsoft.com/en-us/library/br244983.aspx –

回答

1

您不應該在ComPtr上撥打AddRefRelease,並且默認情況下您不能。你必須使用像comPtr.Get()->Release這樣的hacky模式來做到這一點,而且你最喜歡會導致問題。

Microsoft::WRL::ComPtr的目的是在正常代碼和處理C++異常時自動清除COM指針。將ComPtr的副本複製到另一個ComPtr會自動增加ref-count,並且每次ComPtr變量超出範圍時,都會自動減少ref-count。這極大地簡化了錯誤處理和清理,這就是爲什麼您所看到的代碼在調用Release時不會出現氾濫的原因。

對於'轉讓所有權'有一些特殊的方法AttachDetach,這樣ref-count不會改變,但它們是針對特殊用例的。您也可以使用Swap做一些技巧,這對於強大的編碼非常有用。

如果你想明確'釋放'一個ComPtr變量,你可以給它分配null或者更好地使用Reset

與所有smart-pointers一樣,您應該考慮指針的生命週期以決定如何使用它。如果一個函數或類要「擁有」指向的對象,那麼使用智能指針是正確的方法。如果該函數剛剛與對象一起工作,然後在生命週期中沒有任何更改地返回,那麼函數應該採用原始指針,而不是在調用它時使用ComPtr上的Get方法。否則,如果對象的所有權實際上沒有問題,那麼程序會浪費大量時間來不必要地增加和減少ref-count。

另一種選擇是智能指針參數傳遞作爲const ComPtr&從而避免裁判計數循環,但它迫使呼叫者使用ComPtr當原料指針是更不可知的調用者的副作用對象生存期策略,因此更加靈活。

我已經寫了如何在DirectX Tool Kit wiki上使用ComPtr。您還可以看到MSDN

對於非COM對象,std::unique_ptr是一個不錯的選擇。您也可以使用std::shared_ptrstd::weak_ptr,但在共享的情況下會涉及很多性能影響和邊緣情況,因此對於COM,堅持使用ComPtr,對於使用單個所有者的堆分配對象,堅持std::unique_ptr是最佳做法。

1

您通常不需要通過智能指針調用AddRefRelease - ComPtr的整個點是它爲您調用的那些。

如果您將智能指針轉換爲「手動管理」(普通)指針,您可能仍然需要調用它們。

+0

謝謝! @immibis – CPlusPlusProgrammer

相關問題