- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有点习惯通过 COM 进行引用计数的概念,但我对 shared_ptr 有点陌生。我在 shared_ptr 中没有找到 CComPtr 的几个不错的属性,我想知道防止误用 shared_ptr 的模式是什么。
AddRef/Release 模式保证每个对象只有一个引用计数(引用计数存储在对象本身),因此当您有一个随机指针围绕它创建一个 CComPtr 时,它是安全的。另一方面,shared_ptr 有一个单独的 refcount 指针,所以在一个对象上创建一个新的 shared_ptr 是不安全的(为什么标准提供了一个构造函数,它在 shared_ptr 上采用 T* ,如果这样做很不安全?)。这似乎是一个很大的限制,我不明白如何使用 shared_ptr...
有点极端的情况:我过去用 AddRef/Release 做过的事情:我想要一个对 IFoos 的“弱引用”容器(例如从 URL 到 IConnection 的映射或其他)。使用 weak_ptr,我可以做到这一点,但我的集合不会“自行清理”,我将在其中包含过期的指针。使用 Release,我可以实现我自己的弱指针(一些工作)来实际清理集合。是否有 shared/weak_ptr 的替代方案?
直觉上,与只执行一次的 IUnknown 世界相比,执行两次内存分配以创建一个对象(一次用于引用计数,一次用于对象)会降低性能。访问对象时也存在局部性损失(假设 AddRef 之后经常读取对象的内容,这似乎很可能)。是否比较了两种方法的成本?
最佳答案
why does the standard provide a constructor that takes a T* on shared_ptr if it's so unsafe to do?
因为这是获得 shared_ptr
的唯一途径不会打扰。您可以使用 shared_ptr
在任何。我什至通过使用删除器对象将它们用于 C 接口(interface)的对象。像 cairo_t*
这样的东西等等。这样一来,我就再也不必释放任何东西了。
你不能用 CComPtr
做到这一点;它只适用于 IUnknown
-样式对象。
此外,还有 std::make_shared
,它创建了一个 shared_ptr
直接从对象类型和构造函数的参数。所以你甚至看不到指针(它通常在一次分配中分配对象及其引用计数,而不是两次)。
正确的 C++ 习语 shared_ptr
非常简单:始终使用 make_shared
或 alloc_shared
.如果您不能使用它们,那么正确的习惯用法是仅将直接裸指针构造函数与new
一起使用。 : shared_ptr<T> pVal{new T{...}};
(或创建指针的适当函数)。永远不要在你不知道来源的指针上使用它。
Is there an alternative with shared/weak_ptr?
没有,但是如果您愿意,可以使用一些工具来制作。除了明显的方法(定期运行您的集合并删除死的 weak_ptr
s),您可以将删除器与 shared_ptr
相关联这将(除了删除指针之外)调用任何清理函数来删除那些 weak_ptr
Intuitively, there is a performance penalty in doing two memory allocations to create an object
参见 make_shared
, 以上。
There is also a locality penalty when accessing the object (assuming that an AddRef is frequently followed by reading the content of the object, which seems likely).
您不必复制 shared_ptr
与其内容对话,也不必为此增加引用计数。
现在,让我们谈谈一些事情CComPtr
不能做。这是侵入性的。它不能与任意分配器或删除器一起使用(当它具有侵入性时显然不那么重要)。它不能做指针别名,你有一个 shared_ptr
对象的成员,但实际的引用计数是针对它所属的对象的。这是一件非常有用的事情。
哦,是的,它不是跨平台的。它未绑定(bind)到 COM,IUnknown
,以及所有开销。
关于c++ - shared_ptr 与 CComPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243520/
使用 shared_ptr 时,我应该只使用 shared_ptr 吗?申报一次或申报shared_ptr无论我经过哪里? 所以在我新建实例的函数中,我将它包装在 shared_ptr 中但是当我从函
#include #include #include using namespace std; struct Node { Node(int data, boost::shared_pt
对于我目前正在处理的代码,我们有时需要使用较旧的编译器在一些较旧的系统上进行编译(例如,我们在较旧的 IBM BlueGene/L 上运行 sims,其支持契约(Contract)规定了一些非常旧的
我正在阅读 this answer作者指的是boost best practices其中说: Avoid using unnamed shared_ptr temporaries to save ty
我正在处理几个类,我想知道如何在我的应用程序类中使用普通成员,而该成员需要使用 shared_from_this()? 这里有一些代码来阐明我的意思(见评论) class Observable { p
我有一个 Foo 类,其中包含一个 Hotel 类 的 shared_ptr,以及一个 Rules 类(位于 namespace Rules 内): class Foo { public: //
我想不通。看起来我遗漏了一些简单的东西?我要在 MakePointToSameValue 中输入什么,以便在点 (1) b.ptr 和c.ptr 与a.ptr 指向同一个 换句话说,a.ptr.get
我已尽我所能制作了 SSCE。我怀疑共享指针在我在 main 中请求它们之前解构(释放)了我的对象。如何在不完全绕过共享指针的情况下防止这种情况发生?这是一个程序中的孤立问题,否则可以通过使用 sha
这个问题在这里已经有了答案: Set shared_ptr with new_pointer that is old_pointer + offset (1 个回答) 关闭 4 年前。 我目前正在学
假设我们有一个类,成员如下 std::map> member_我们无法替换 member通过具有 std::shared_ptr 的 map ,因为该类必须对 ObscureType 的非常量函数进行
我正在用 C++ 做学校作业(我还在学习)。我正在尝试实现随机生成的二叉树结构,使用 shared_ptr 在多个地方存储节点的信息(我需要它作为作业)。考虑以下示例代码(这是我的小测试程序): #i
我有以下类(class) struct Images { std::vector > ptr_vector; } 将 ptr_vector 放入 std::shared_ptr 中不会在复制
我刚刚对一个项目进行了大规模重构,添加了一个基类来代替现在所说基类的派生类(因为我想要这个类的更多“类型”)。 我的问题是,一些实用函数将原始类 A 的引用作为 shared_ptr,因此函数声明如下
我记得 Scott Meyers 教我的 func(shared_ptr(new P), shared_ptr(new Q)); 是危险的,因为(如果我没记错的话)内存分配、引用计数(构造)和分配给
给定 struct X { void f(std::shared_ptr); }; auto x(std::make_shared()); 我大概可以安全地做 x->f(std::move(x
我试着介绍了一些const一些新代码的正确性(实际上是功能范例),发现我无法传递 std::shared_ptr到一个需要 std::shared_ptr 的函数.请注意,我不想放弃 constnes
我需要将原始指针包装到 shared_ptr 中,以便将其传递给函数。该函数在返回后不保留对输入对象的任何引用。 { MyClass i; shared_ptr p(&i); f(p);
我在继承链中有4个类:A-> B-> C,A-> B-> D,其中B是唯一的类模板。 我想拥有一个在id和对象指针(C或D)之间映射的std::map,但是我在将make_shared输出分配给std
boost::shared_ptr 是否解决原始指针问题? Base* p = new Base(); shared_ptr sp(p); shared_ptr sq(p); 两个 shared_
How can shared_ptr be a subclass of shared_ptr? 我想知道如何实现模板类 C这样 C是 C 的子类? 我已经观察到上述情况,例如 shared_ptr和
我是一名优秀的程序员,十分优秀!