首页 > 解决方案 > 为什么我能够在 C++ 中将常量 shared_ptr 分配给非常量 shared_ptr?

问题描述

我以为我不能将常量分配给shared_ptr非常量shared_ptr。但令人惊讶的是,我能够按如下方式分配,并且工作正常。

#include <iostream>
#include <memory>

using namespace std;

int main()
{
    const std::shared_ptr<const string> a = std::make_shared<const string>("Hello world");

    std::shared_ptr<const string> b = a;
    cout << "a count " << a.use_count() << ", b count " << b.use_count() << endl;
    return 0;
}

.use_count()正在打印为 2。任何人都可以帮助我了解我是如何做到的吗?

标签: c++constants

解决方案


您的代码中的情况与此处完全相同:

const int a = 5;
int b = a;
std::cout << "a=" << a ", b=" << b << std::endl; // a=5, b=5
b = 10;
std::cout << "a=" << a ", b=" << b << std::endl; //a=5, b=10

不是特别令人惊讶,对吧?我有const int,我用它来初始化非常量int。from 的值a被复制到b并且a根本没有被修改。

同样发生在const std::shared_ptr. 复制构造另一个对象不会修改原始对象。

use_count可以更改,因为它不是std::shared_ptr类的成员。std::shared_ptr需要在堆上分配两个内存块 - 一个控制块和实际对象块。
每个std::shared_ptr实例只存储一个指向控制块和实际对象的指针。控制块存储使用计数(std::shared_ptr持有指向它的指针的 s 数)。

当您复制std::shared_ptr时,它会增加控制块中的使用计数并获得相同的两个指针。当std::shared_ptr死亡时,它会减少使用计数(如果使用计数达到 0,则删除两个块)。

所以,总结一下: use count 不是 的成员std::shared_ptr,因此它甚至可以改变 for const std::shared_ptr(否则const std::shared_ptr将毫无用处)。


推荐阅读