有人可以解释shared_ptr和unique_ptr之间的差异吗?
我正在使用普通指针编程,但我听说像Boost这样的库实现了智能指针.我还看到在Ogre3D渲染引擎中有一个深度使用共享指针.
三者之间究竟有什么区别,我应该坚持使用它们的类型吗?
我一直在使用pimpl成语制作一些对象,但我不确定是否使用std::shared_ptr或std::unique_ptr.
据我所知,std::unique_ptr是更有效的,但是这是没有这么多的问题,对我来说,因为这些物体是比较重量级反正做的成本std::shared_ptr比std::unique_ptr相对较小.
我目前std::shared_ptr只是因为额外的灵活性.例如,使用a std::shared_ptr允许我将这些对象存储在散列映射中以便快速访问,同时仍然能够将这些对象的副本返回给调用者(因为我相信任何迭代器或引用可能很快变得无效).
但是,这些对象确实没有被复制,因为更改会影响所有副本,所以我想知道也许使用std::shared_ptr和允许副本是某种反模式或坏事.
它是否正确?
首先,由于存在不同类型的智能指针,我想将这个问题集中在其中两个上:引用计入侵入式和非侵入式智能指针.针对每种指针类型单独询问该问题.
我不确定如何制定我的问题,所以这就是我不问的问题:我不是在问为什么或什么时候需要智能指针.我不应该使用哪种类型的智能指针.
这就是我所要求的,我希望它足够清楚:当处理"智能管理"对象时,我应该在哪些上下文中使用哪个指针语义?也就是说,智能指针语义,原始指针语义,别的东西(比如对智能指针的引用)?
显而易见的是,当我"存储"指向对象的指针(对象是引用计数的内存实体)时,例如全局指针,或者作为类成员,它应该是一个智能指针,因此它会声称所有权,但是其他情况怎么样?
当我将指针作为函数参数传递时,它应该是智能指针,原始指针,对智能指针的引用,还是其他什么?返回指针怎么样?本地指针?等......
当然,我可以在任何地方使用智能指针,这是最安全的选择,但我觉得这实际上是不必要的并增加了开销.