你的逻辑问题在于你相信原因shared_ptr
托管指针和托管指针之间有区别get
指针是因为make_shared
不可用。因此,如果我们强迫每个人都使用make_shared
创造shared_ptr
,我们不需要这种区别。
这是不正确的。
你可以实施shared_ptr
的基于指针的构造函数没有这种区别。毕竟,在最初创建托管时shared_ptr
, the get
指针和托管指针是相同的。如果你想要shared_ptr
成为sizeof(T*)
,你可以只拥有shared_ptr
获取get
来自托管块的指针。这与是否T
嵌入在托管块中。
所以区别确实有什么都没有与make_shared
及其嵌入的能力T
与托管块位于同一内存中。或者更确切地说,缺乏它。
不,托管指针和托管指针之间的区别get
指针被创建,因为它添加了features to shared_ptr
。重要的。您列出了其中一些,但错过了其他一些:
-
有能力拥有shared_ptr
到基类。那是:
shared_ptr<base> p = make_shared<derived>(...);
要做到这一点,你must特定实例指向的内容和控制块控制的内容之间存在区别。
-
static_pointer_cast
and dynamic_pointer_cast
(and reinterpret_pointer_cast
在 C++17 中)。这些都依赖于托管指针和托管指针之间的区别get
指针。
- 这还包括
enable_shared_from_this
在基类中。
A shared_ptr
指向本身由 a 管理的类型的成员子对象shared_ptr
。同样,它要求托管指针不能与get
指针。
您似乎还忽略了管理不是由您创建的指针的能力。那是一个critical能力,因为它允许您与其他代码库兼容。在内部,您可以使用shared_ptr
管理 1998 年编写的库所做的事情。
按照您的方式,您可以将代码分为两个时期:C++11 之前和 C++11 之后。你的shared_ptr
对于任何未明确为 C++11 编写的代码不会执行任何操作。
将所有这些功能包装成一个类型的好处是:
你不需要另外一个。
shared_ptr
,因为它满足了如此多的需求,所以几乎可以在任何地方有效地使用。它可能不是绝对最有效的类型,但是will几乎在所有情况下都能完成这项工作。而且这样做的速度并不慢。
它通过多态性处理共享所有权。它处理成员对象的共享所有权。它处理您未分配的内存的共享所有权。它处理具有特殊分配/释放需求的内存共享所有权。等等。
如果您需要共享所有权语义,并且需要它work, shared_ptr
每次都会为您提供支持。根据你提出的想法,总会有一些限制,一些东西会妨碍你完成工作。
默认情况下,应该优先选择一种有效的类型,而不是无效的类型。