c++ - 为什么我能够在 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。任何人都可以帮助我了解我是如何做到的吗?
解决方案
您的代码中的情况与此处完全相同:
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
将毫无用处)。
推荐阅读
- android - 为什么布尔 DBHelper.updateStudents(java.lang.String,java.lang.String,java.lang.String,java.lang.String, java.lang.String) on nullobjectreference
- arrays - 直接从 msi 位置路径和 for 循环中卸载时出现问题
- angular - 我的属性在 .ts 文件中未定义但 .html 文件有效的原因是什么
- symfony - 在 Symfony 4.4 中使用 RedisTagAwareAdapter
- android - 来自 SpaceX REST API 的数据未显示
- python - 当远程模块具有 pytest_collection_modifyitems() 时,Pytest-xdist 抛出 AssertionError
- security - 从过去 20 天开始,我不断受到 DDoS 攻击
- java - 限制每分钟 JWT 令牌的数量
- nginx - 用于通过 url 播放 .ogg 音频的 Nginx 配置
- reactjs - 如何在材质 UI 中的深色和浅色主题之间为 Paper 组件交换 2 种不同的背景颜色?