我有点习惯于通过COM进行计数的概念,而我对shared_ptr还是有些陌生。我没有在shared_ptr中找到CComPtr的几个不错的属性,并且我想知道什么是防止滥用shared_ptr的模式。
最佳答案
因为这是拥有shared_ptr
而不被打扰的唯一方法。您可以在任何东西上使用shared_ptr
。通过使用Deleter对象,我什至在C接口(interface)的对象上使用了它们。诸如cairo_t*
之类的东西。这样,我再也不必释放任何东西了。
您不能使用CComPtr
来做到这一点;它仅适用于IUnknown
样式的对象。
另外,还有std::make_shared
,它直接从对象类型和构造函数的参数创建shared_ptr
。因此,您甚至都看不到指针(它通常以一种分配而不是两种分配方式分配对象及其引用计数)。
正确的带有shared_ptr
的C++习惯用法非常简单:始终使用make_shared
或alloc_shared
。如果不能使用它们,那么适当的习惯用法是仅将直接裸指针构造函数与new
:shared_ptr<T> pVal{new T{...}};
(或创建指针的适当函数)串联使用。切勿在您不知道其起源的指针上使用它。
不,但是如果您愿意,有一些工具可以使之成为现实。除了显而易见的方法(定期运行您的集合并删除不起作用的weak_ptr
)之外,您还可以将Deleter与shared_ptr
关联,该weak_ptr
将(除了删除指针之外)调用任何清理函数来删除这些make_shared
s。
参见上面的shared_ptr
。
您无需复制CComPtr
即可与其内容对话,也无需增加引用计数即可。
现在,让我们谈谈shared_ptr
无法完成的一些事情。太麻烦了它不能与任意的分配器或删除器一起使用(显然,当它具有侵入性时,它并不那么重要)。它无法执行指针别名操作,在这里,您有一个指向对象成员的IUnknown
,但实际引用计数是针对该对象所属的对象的。这是一件非常有用的事情。
哦,是的,它不是跨平台的。它不限于COM,ojit_code和所有这些开销。