首页 > 解决方案 > 使共享指针指向一个变量

问题描述

刚开始使用共享指针并尝试了这样的示例程序:

int x = 10;
shared_ptr<int> ptr = make_shared<int>(x);
*ptr = 11;
cout<< x << " " << *ptr;

结果是 10 11 这对我来说没有意义,因为 ptr 指向 x,因此 x 的值应该更改为 11。有人可以在这里解释一下吗?当指向它的共享指针发生更改时,我还需要更改 x 的值。请让我知道如何实现这一目标。提前致谢。

标签: c++c++11pointersshared-ptr

解决方案


你误解了什么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.


推荐阅读