我对通过COM进行引用计数的概念有些熟悉,但对shared_ptr还比较新。CComPtr具有几个很好的属性,而这些属性在shared_ptr中找不到,我想知道有哪些模式可以防止shared_ptr被误用。
AddRef/Release模式保证每个对象只有一个引用计数(引用计数存储在对象本身上),因此当您有一个随机指针时,安全的做法是创建一个CComPtr。另一方面,shared_ptr有一个单独的引用计数指针,因此在对象上创建一个新的shared_ptr是不安全的(如果这样做这么不安全,为什么标准会提供一个接受T*的构造函数呢?)。这似乎是一个很大的限制,我不明白如何使用shared_ptrs……
一个小角落的情况:过去我使用AddRef/Release做过的事情:我想要一个IFoo的“弱引用”容器(例如从URL到IConnection的映射)。使用weak_ptr,我可以做到这一点,但我的集合不会自动清理,其中将包含过期指针。使用Release,我可以实现自己的弱指针(需要一些工作),它实际上可以清理集合。在shared/weak_ptr中是否有替代方案?
直觉上,创建对象时进行两个内存分配(一个用于引用计数,一个用于对象)相对于IUnknown世界中只进行一次内存分配会有性能损失。当访问对象时也存在局部性惩罚(假设AddRef经常后跟读取对象的内容,这似乎很可能)。这两种方法的成本是否进行了比较?
make_shared
,则不会产生两次分配。否则,请发布您的实际用例,因为在空气中进行争论是很困难的。shared_ptr
非常好,但并不是所有情况的唯一解决方案。 - Kerrek SBmake_shared
并不需要这样做。所有实现都会这样做,但这并不是严格的要求。 - Nicol Bolas