是否有可能從boost :: weak_ptr獲取原始指針? Boost的shared_ptr具有get()方法和「 - >」運算符。 weak_ptr沒有相同的功能是否有一些基本原理?我可以從boost的weak_ptr獲取一個原始指針嗎?
6
A
回答
16
A weak_ptr
擁有非擁有的引用,所以它引用的對象可能不再存在。使用weak_ptr
所持有的原始指針本質上是危險的。
正確的做法是使用weak_ptr::lock()
將weak_ptr
推廣到shared_ptr
並從中獲取指針。
Boost weak_ptr
documentation解釋了爲什麼提供get()
功能作爲weak_ptr
的一部分是不安全的,並且有可能導致問題的代碼示例。
2
首先需要在獲取原始指針之前從weak_ptr派生shared_ptr。
您可以撥打lock得到shared_ptr的,或shared_ptr的構造函數:
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();
+8
正如所寫,這是不安全的 - 如果在臨時'shared_ptr'被銷燬時刪除該對象,則可能會留下一個懸掛指針。只要你使用原始指針,你應該保持'shared_ptr'。 – 2010-05-17 15:14:06
3
這是一個老問題和接受的答案是好的,所以我毫不猶豫地張貼其他的答案,但有一點似乎缺少的是一個很好的習慣用法例如:
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
這個成語的一個關鍵優點是強指針的作用域是,如果真塊,這有助於防止意外使用非初始化引用,或保存一個長期的強有力的參考呃比實際需要的。
相關問題
- 1. 從原始指針創建weak_ptr <>
- 2. 我可以從jwysiwyg中獲取原始textarea ID嗎?
- 3. 我可以從highcharts.js中獲取原始數據嗎?
- 4. Boost中的作用域指針:什麼意思是一個原始指針?
- 5. 使用boost :: swap交換原始指針?
- 6. Boost-Python原始指針構造函數
- 7. 如何一個boost :: weak_ptr的以一個boost :: shared_ptr的
- 8. Boost python,將原始指針與託管指針進行比較?
- 9. 如何從此指針獲取std :: weak_ptr <MyClass>?
- 10. PHP - 可以返回一個指針嗎?
- 11. 我們可以說指針值指定了一個對象嗎?
- 12. 可以從BufferedImage獲取原始圖像嗎?
- 13. 我們可以使用「this」指針獲取對象名稱嗎
- 14. 我可以從指針地址(Linux上的C)獲取NUMA節點嗎?
- 15. 我可以投這樣的指針嗎?
- 16. 一個類內的指針可以指向這個嗎?
- 17. lambda可以捕獲指向某個方法的指針嗎?
- 18. 我可以指定一個始終運行的Makefile配方嗎?
- 19. 我可以從Silverlight中的BitmapImage獲取一個字節[]嗎?
- 20. 我可以從另一個腳本獲取變量的值嗎?
- 21. 從原始指針到std :: shared_ptr的
- 22. 我可以在對象*** p中有一個指針矢量嗎?
- 23. 我可以有一個弱靜態指針嗎?
- 24. 我可以在C中創建一個Char指針數組嗎?
- 25. 獲得一個C的原始值++的ofstream我們把指針(存儲)
- 26. 可以有兩個指針指向同一個字符串嗎?
- 27. 函數可以返回一個指向NULL的指針嗎?
- 28. 在boost R樹中存儲原始指針的問題
- 29. 我可以在C++中捕獲錯誤的指針錯誤嗎?
- 30. 我可以借用一個指向Rust的共享特徵的指針嗎?
對於這個問題,如果你得到了一個'shared_ptr'的原始指針,那麼這個指針也會被銷燬......如果是Multithread,你甚至可以在運行中留下一個懸掛指針代碼if(!weak.expired())weak-> run();'因爲指向的對象可能在測試和方法執行之間被破壞(我認爲方法本身被正確同步)... – 2010-05-17 15:23:19
@Matthieu:當然你*可以*,就像你可以留下一個懸掛指針一樣,如果你顯式地刪除一個對象但保留一個指針。必須將'weak_ptr'提升爲'shared_ptr'的一點是,它鼓勵您按照通常用於'shared_ptr :: get'的規則正確地使用原始指針。對於直接從'weak_ptr'獲取的原始指針的使用,沒有等同的方法。 – 2010-05-17 18:11:42