我正在使用智能指針或ComPtr。我正在使用它與我的directX應用程序,我還沒有看到其他人使用ComPtr在其代碼中調用release函數。那麼智能指針會釋放智能指針所指的數據,還是需要手動執行?我不知道這是否能讓你知道,如果不這樣做,我會以更好的細節作出迴應。我是否必須使用ComPtr調用釋放函數?
回答
您不應該在ComPtr
上撥打AddRef
或Release
,並且默認情況下您不能。你必須使用像comPtr.Get()->Release
這樣的hacky模式來做到這一點,而且你最喜歡會導致問題。
Microsoft::WRL::ComPtr
的目的是在正常代碼和處理C++異常時自動清除COM指針。將ComPtr的副本複製到另一個ComPtr會自動增加ref-count,並且每次ComPtr變量超出範圍時,都會自動減少ref-count。這極大地簡化了錯誤處理和清理,這就是爲什麼您所看到的代碼在調用Release
時不會出現氾濫的原因。
對於'轉讓所有權'有一些特殊的方法Attach
和Detach
,這樣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_ptr
和std::weak_ptr
,但在共享的情況下會涉及很多性能影響和邊緣情況,因此對於COM,堅持使用ComPtr
,對於使用單個所有者的堆分配對象,堅持std::unique_ptr
是最佳做法。
您通常不需要通過智能指針調用AddRef
或Release
- ComPtr
的整個點是它爲您調用的那些。
如果您將智能指針轉換爲「手動管理」(普通)指針,您可能仍然需要調用它們。
謝謝! @immibis – CPlusPlusProgrammer
- 1. 使用鼠兔BlockingConnection時,是否basic_ack()必須放置在回調函數
- 2. 釋放返回的對象還是我必須使用自動釋放
- 3. 我是否必須在read_triplet中釋放doublet?我該怎麼做?
- 4. 我是否必須使用onPause/onStart/onDestroy
- 5. 我是否必須使用UNION insted JOIN?
- 6. 是否必須使用SSL?
- 7. Swift UnsafeMutablePointer:我必須在釋放之前調用deinitialize嗎?
- 8. 我是否必須釋放弧中的無弧對象?
- 9. 「參數必須是可調用函數」當使用scipy.integrate.quad
- 10. 在調用qRegisterMetaType之前,我是否必須調用Q_DECLARE_METATYPE?
- 11. 使用jQuery進行AJAX調用是否必須返回數據?
- 12. 必須釋放代碼依賴於通過函數調用保留的ebx嗎?
- 13. jqGrid.info_dialog不是函數,我必須調用extend嗎?
- 14. 使用vlfeat時,我必須明確釋放內存嗎?
- 15. 我必須釋放這個變量嗎?
- 16. C++我總是必須使用std :: move來調用移動構造函數嗎?
- 17. 匿名函數是否必須使用括號括起來?
- 18. 在使用之前,類函數/變量是否必須聲明?
- 19. 用戶ID是否必須是整數?
- 20. 是否必須使用@Override註釋繼承的方法?
- 21. Object Pascal:是否必須釋放所有對象(類)?
- 22. 如果我綁定參數,是否必須使用mysql_real_escape_string?
- 23. 我們在使用會話時是否必須使用mysql_real_escape_string()?
- 24. 我是否必須使用Compass使用Django-Grappelli修改CSS?
- 25. 對malloc的調用是否必須通過調用才能在動態內存池中釋放?
- 26. 我是否必須在循環函數中使用循環Notes對象?
- 27. 每次使用onMessage.addListener responseCallback時,是否必須調用return true?
- 28. 是否必須使用「remember_token」字段?
- 29. 是否必須使用flags屬性?
- 30. 分配時是否必須使用initWithString?
ComPtr:「創建一個智能指針類型,它表示由模板參數指定的接口.ComPtr自動維護底層接口指針的引用計數,並在引用計數爲零時釋放接口。源MSDN:https://msdn.microsoft.com/en-us/library/br244983.aspx –