首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能指针使用

智能指针使用
EN

Stack Overflow用户
提问于 2010-12-29 12:20:54
回答 5查看 1.1K关注 0票数 3

我有一个项目,我想让智能指针更好地使用。

其主要思想是在从函数返回新对象时使用它们。问题是使用什么智能指针?auto_ptr还是shared_ptr?正如我所知,auto_ptr速度较慢,但它可以回到“纯”指针。

如果我在不需要智能指针的地方使用智能指针,它会使性能变慢吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-29 12:40:20

是什么使你认为auto_ptrshared_ptr慢?通常,我期望相反的情况为真,因为shared_ptr需要更新引用计数。

至于您应该使用的是什么,不同的智能指针意味着不同的所有权语义。所有权意味着在不再需要对象时删除它的责任。

  • 原始指针意味着无所有权;正确使用智能指针的程序仍可能在许多不打算拥有权的地方使用原始指针(例如,如果需要将对对象的可选引用传递到函数中,则通常使用原始指针)。
  • non-transferable scoped_ptr指的是单一的(即非共享的),所有权.
  • auto_ptr意味着单一的(即非共享的)所有权。这是我将使用的智能指针,用于从函数返回新构造的对象(函数将对象传递给调用方)。auto_ptr的缺点是,由于定义auto_ptr时语言的限制,很难正确使用(这给它带来了很坏的声誉,尽管具有单一、可转移的所有权语义的智能指针的预期目的是有效的,而且是有用的)。
  • unique_ptr具有与auto_ptr相同的语义,但是使用新的C++0x特性(rvalue引用)使其比auto_ptr安全得多(不太容易被错误使用)。如果您是在unique_ptr可用的平台上开发的,那么您应该使用它而不是auto_ptr
  • shared_ptr意味着共享所有权。在我看来,这是过度使用。它确实有许多有效的用途,但不应简单地用作默认选项。

我还要补充的是,shared_ptr经常与STL容器一起使用,因为其他智能指针类无法在该上下文中实现它们的预期功能(因为在容器内部复制值)。这通常导致shared_ptr的使用,其中共享所有权并不是真正意义上的。在这些情况下,我建议(在可能的情况下)使用boost指针容器类(ptr_vectorptr_map等),这些类提供了具有可转移但(非共享)所有权的容器的(普遍希望的)语义。

您应该始终考虑对象的所有权:在大多数情况下,使用干净的系统设计,每个对象都有一个明显的所有者,并且不需要共享所有权。这样做的优点是,可以很容易地看到对象将被释放的确切位置和时间,并且不需要计算开销。

编辑以注意新的unique_ptr

票数 12
EN

Stack Overflow用户

发布于 2010-12-29 12:26:05

您可能应该使用shared_ptr<>。如果不知道你到底想做什么,就很难说得更具体。最好阅读它的文档,看看它是否能满足您的需要。

性能差异很可能可以忽略不计。只有在极端的情况下,我才会产生明显的影响,就像每秒复制这些指针几百万次一样。

票数 2
EN

Stack Overflow用户

发布于 2010-12-29 12:30:46

我更喜欢shared_ptr,auto_ptr会带来很多麻烦,而且它的使用也不太直观。如果您期望将此对象插入到STL容器中,那么您肯定希望使用shared_ptr。

关于性能,您有一个成本,但这是最小的,你可以忽略它的大部分时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4554028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档