我有点习惯于通过COM进行计数的概念,而我对于shared_ptr还是有些陌生。我在shared_ptr中找不到CComPtr的几个不错的属性,我想知道是什么模式可以防止滥用shared_ptr。
AddRef / Release模式可确保每个对象只有一个引用计数(引用计数存储在对象本身上),因此当您有随机指针围绕它创建CComPtr时,这是安全的。另一方面,shared_ptr有一个单独的refcount指针,因此在一个对象上创建一个新的shared_ptr是不安全的(为什么标准这样做会提供一个在shared_ptr上使用T *的构造函数,如果这样做很不安全吗?)。这似乎是一个很大的限制,以至于我不明白如何使用shared_ptrs ...
一个极端的例子:我过去用AddRef / Release完成的事情:我想要一个对IFoos的“弱引用”的容器(例如,从URL到IConnection的映射等)。使用weak_ptr,我可以做到这一点,但是我的集合不会“清理自身”,我将在其中拥有过期的指针。使用Release,我可以实现自己的弱指针(需要一些工作),实际上可以清理集合。有共享/ weak_ptr的替代方法吗?
直观地讲,与仅执行一个操作的IUnknown世界相比,执行两个内存分配来创建一个对象会降低性能(一个用于refcount,一个用于该对象)。访问对象时,也会受到局部性的影响(假设AddRef经常跟随读取对象的内容,这似乎是可能的)。是否比较了两种方法的成本?