3 回答

TA贡献1827条经验 获得超8个赞
对我来说,这三种可以满足我的大部分需求:
shared_ptr
-参考计数,计数器达到零时释放
weak_ptr
-与上述相同,但它是的“从属” shared_ptr
,无法取消分配
auto_ptr
-当创建和释放发生在同一个函数中时,或者当对象必须被视为只有一个所有者时。当您将一个指针分配给另一个指针时,第二个指针会从第一个“窃取”对象。
我有自己的实现,但也可以在中找到它们Boost
。
我仍然通过引用传递对象(const
在可能的情况下),在这种情况下,被调用方法必须假定对象仅在调用期间处于活动状态。
我使用的另一种指针称为hub_ptr。这是当您有一个必须从嵌套在其中的对象(通常作为虚拟基类)访问的对象时。可以通过将a传递weak_ptr
给他们来解决,但本身没有a shared_ptr
。众所周知,这些对象的寿命不会比他长,因此将hub_ptr传递给它们(它只是常规指针的模板包装器)。

TA贡献1801条经验 获得超8个赞
简单的C ++模型
在大多数模块中,默认情况下,我看到的是假定接收指针未获得所有权。实际上,放弃指针所有权的函数/方法非常罕见,并且在其文档中明确表达了这一事实。
该模型假定用户仅是他/她明确分配的所有者。其他所有内容都会自动清除(在示波器出口或通过RAII)。这是一个类似C的模型,扩展了以下事实:大多数指针归对象所有,这些对象将自动或在需要时(通常在销毁对象时)释放它们,并且对象的生存期是可预测的(RAII是您的朋友,再次)。
在此模型中,原始指针可以自由循环并且几乎没有危险(但是,如果开发人员足够聪明,他/她将尽可能使用引用代替)。
原始指针
std :: auto_ptr
boost :: scoped_ptr
智能指针C ++模型
在充满智能指针的代码中,用户可以希望忽略对象的生存期。所有者永远不是用户代码:它是智能指针本身(再次是RAII)。问题在于,将循环引用与引用计数的智能指针混合使用可能是致命的,因此您必须同时处理共享指针和弱指针。因此,您仍然需要考虑所有权(弱指针可能毫无意义,即使它比原始指针的优势在于它可以告诉您)。
boost :: shared_ptr
提升:: weak_ptr
结论
无论我描述的模型是什么,除非有例外,否则接收指针都不会获得其所有权,知道谁拥有谁仍然非常重要。即使对于C ++代码,也大量使用引用和/或智能指针。

TA贡献1843条经验 获得超7个赞
从boost开始,还有指针容器库。如果仅在对象的上下文中使用对象,则这些对象比标准的智能指针容器要有效且易于使用。
在Windows上,有COM指针(IUnknown,IDispatch和Friends),以及用于处理它们的各种智能指针(例如ATL的CComPtr和Visual Studio中基于_com_ptr类由“ import”语句自动生成的智能指针)。)。
- 3 回答
- 0 关注
- 425 浏览
添加回答
举报