c++ - 使共享指针指向一个变量
问题描述
刚开始使用共享指针并尝试了这样的示例程序:
int x = 10;
shared_ptr<int> ptr = make_shared<int>(x);
*ptr = 11;
cout<< x << " " << *ptr;
结果是 10 11 这对我来说没有意义,因为 ptr 指向 x,因此 x 的值应该更改为 11。有人可以在这里解释一下吗?当指向它的共享指针发生更改时,我还需要更改 x 的值。请让我知道如何实现这一目标。提前致谢。
解决方案
你误解了什么std::shared_ptr
提供。它是一种共享动态数据所有权的机制;不附加指向非动态数据的指针。
在您发布的代码中,这声明了一个int
初始值为10
int x = 10;
然后这构造了一个指向new int
的共享指针,其唯一关系x
是从后者获取的值以初始化前者。
std::shared_ptr<int> ptr = std::make_shared<int>(x);
换句话说,对于这段代码中的所有意图,上面的内容等价于:
std::shared_ptr<int> ptr = std::make_shared<int>(10);
如果您希望代码中的一堆指针x
通过地址引用,首先问自己为什么,然后问自己为什么不只是使用引用。IE
int x = 10;
// somewhere else
int &ref = x;
ref = 42; // will change x
如果您真正想要的是具有所有权引用计数和适当处置机制的共享状态,那么您可能想要:
std::shared_ptr<int> x = std::make_shared<int>(10);
// somewhere else
std::shared_ptr<int> ptr = x;
使用上面的代码,有两个对动态 的引用int
:共享指针x
和共享指针ptr
。两者都对该动态具有平等和共享的所有权int
。当其中任何一个被销毁时,资源仍然存在,因为它仍然被剩余的共享指针引用。当最后一个未完成的引用被销毁时,动态int
.
推荐阅读
- c# - 如何查找布尔 3x3 网格算法的所有配置
- windows - 如何更改本地服务的用户凭据?
- java - Flutter AppBundle 每次打开时都会崩溃
- r - 如何在 R Markdown 中使用长变量名调整打印的摘要宽度?
- maven - 有没有办法以编程方式在 jenkinsfile 中指定 pom.xml 路径
- python - ImageGrab.grab() 函数的时序
- typescript - 如何在 serverless.ts 中添加请求模式
- android - 无法初始化检测器。输入张量的类型为 kTfliteFloat32 ML Kit
- c - 我的嵌套 if 语句有什么问题?
- php - Codeigniter 4 模块加载常量