【问题标题】:How does the control block of a shared pointer behave with const shared pointers共享指针的控制块如何处理 const 共享指针
【发布时间】:2017-05-14 17:44:40
【问题描述】:
const std::shared_ptr<int> x (new int (2));
const std::shared_ptr<int> y (x);

复制共享指针会更改“const”共享指针指向的控制块,这与 constness 部分不矛盾吗?

【问题讨论】:

  • 我猜,在一个实现中,控制块是mutable,或者更简单——它不是shared_ptr类的实际成员;指向它的指针是成员,不会改变。

标签: c++11 smart-pointers


【解决方案1】:

shared_ptr 包含(一般来说)两个指针。一个用于保存对象,第二个用于使用 refcount 等“内部”数据。如果您将shared_ptr 设为常量,则意味着您无法修改这些指针,但您可以毫无问题地修改它们指向的对象。

如果这是一个矛盾?对我来说不是,但肯定有人会说是。一种哲学问题。 :)

【讨论】:

    【解决方案2】:

    控制块是用户无权访问且不应关注的实现细节。它不是shared_ptr接口的一部分,无法观察到。

    shared_ptr 指针是什么const。这意味着您不能重新分配它。

    在这方面它的行为类似于普通的const 指针:它可以复制,但不能重新分配。

    【讨论】:

    • "表示不能重新赋值。"应该表示不能更改对象的成员。
    • @GillBates 您可能会将const shared_ptr&lt;int&gt; 与shared_ptr&lt;int const&gt; 混淆。
    • 我有点同意 Gill 的观点,一个 const 对象意味着它的成员不能被改变(除非它们是可变的)。
    • @mkmostafa 你指的是哪些成员?
    • 我不是在讨论 int 指针,而是在谈论 shared_ptr 对象,显然,控制块是共享指针的一部分,上面的声明表明共享指针本身是一个常量,但是当它被复制了,内部发生了一些变化。
    【解决方案3】:

    它可以将控制块成员声明为mutable(不太可能,请参阅Maxim 的评论),或者(更有可能)它可以将指向控制块的非常量指针作为成员。更改 const shared_ptr is allowed 中指向的控制块的值,而不是在 const 时重新分配该指针。

    以 MSVC2015 的真实世界为例(我知道我知道),shared_ptr 有一个成员 _Rep:

    private:
        _Ty *_Ptr;
        _Ref_count_base *_Rep;
    

    shared_ptr可以通过_Rep修改使用次数。

    【讨论】:

    • mutable 在这里是不必要的,因为const shared_ptr&lt;&gt; 不能被分配给。
    • @MaximEgorushkin 它可能有一个mutable 引用计数对象成员,当shared_ptr 为const 时可以更改。在这种情况下,这是必要的。尽管这只是一个实现细节。
    • @DV 请问为什么?
    • shared_ptr 不可能有自己的引用计数成员,因为计数器在指向同一个对象的shared_ptrs 之间共享。
    • @MaximEgorushkin 这没关系,在增加或减少引用时,shared_ptrs 都是已知的,因此实现可以要求它的引用计数/复制它/减少它。你说得对,这不是很明智,但这是可能的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多