是否有可能从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