这是intrusive_ptr的有效用法吗?

| 在我的代码中,涉及intrusive_ptrs时,我遵循两个规则: 通过值传递原始指针意味着该原始指针在该函数的生存期内被保证是有效的。 如果要在函数的生存期之外存储和使用原始指针,则应将其存储在intrusive_ptr中。 许多Internet评论员已经写道,与第三方代码相比,shared_ptr应该比intrusive_ptr更可取。但是,intrusive_ptr避免了智能指针的传递,因为您可以从原始指针创建intrusive_ptr,就像在函数寿命之外需要对象时。 我只是担心自己会丢失一些东西,因为我读过的东西都没有涉及到intrusive_ptrs,而且大多数人似乎更喜欢shared_ptrs,即使它们在使用enable_shared_from_this和继承时会带来内存开销以及问题。
已邀请:
只有在绝对必要时,才应在具有所有权语义的公共API中传递原始指针。例如。与您不能更改其接口的代码接口。 在私有API中传递原始指针,例如单个类的成员内部没有问题。 请考虑以下三个功能:
void f(A* a);
void g(std::unique_ptr<A> a);
void h(std::shared_ptr<A> a);
f
的所有权语义尚不清楚。如果您是
f
的客户,则需要阅读文档以了解
f
是否要取消分配
a
,或忽略
a
的所有权问题。
g
的所有权语义很清楚。当您呼叫
g
时,会将
a
的所有权传递给
g
,并且您不再对此承担责任。 “ 6”将取消分配“ 4”或将该资源的所有权转移到其他地方。
h
的所有权语义很清楚。当您致电
h
时,您和
h
成为
a
的共同所有人。最后一个熄灭灯。
void q(boost::intrusive_ptr<A> a);
q
具有与
h
相同的所有权语义。主要区别在于必须存在以下自由函数:
intrusive_ptr_add_ref(A*);
intrusive_ptr_release(A*);
如果您是
f
的作者,并且在
a
上调用了这些函数,则应记录为例。您的客户不一定知道您是。而且,如果您是ѭ1a的客户,除非您阅读read1ѭ的文档,否则您将无法知道ing1ѭ是否会调用这些函数。 如果您是
f
的作者,并且打算调用
intrusive_ptr_*
函数,则可以通过编码
q
在界面中使它显式。 但是通常并没有令人信服的理由强加给
A
的作者编写write25ѭ函数。您可以通过编写ѭ12you来获得与
q
相同的所有权语义,而无需对
A
施加任何其他要求。 内存开销 如果您使用以下方法创建
shared_ptr
 shared_ptr<A> p = make_shared(arguments-to-construct-an-A);
那么您的
shared_ptr
将具有与
intrusive_ptr
完全相同的内存开销。该实现将在同一内存分配中分配A和refcount。您的客户不需要知道或关心您的
shared_ptr
如此高效地构造。
intrusive_ptr确实会带来其他价格:您必须使用内存管理信息来使实际设计混乱,使事情变得比所需的复杂,项目的参与者将不熟悉您的推理(甚至是intrusive_ptr),并且您需要更多的文档。 另外:您是否曾经基准测试过复制智能指针的开销实际上会影响您的应用程序?我宁愿先使用简单版本,并且仅在确实需要时才引入intrusive_ptr。

要回复问题请先登录注册