如何解决使共享指针指向变量
刚开始使用共享指针并尝试了这样的示例程序:
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
,请先问问自己为什么,然后问问自己为什么不只是使用引用。即
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
和共享指针{{ 1}}。两者都拥有该动态 ptr
的平等和共享所有权。当其中一个被销毁时,资源仍然存在,因为它仍然被剩余的共享指针引用。当最后个未完成的引用被销毁时,动态int
也会被销毁。
make_share
使用传递给它的参数构造一个新对象。在这种情况下,它是 x
我猜你需要shared_ptr<int*>
。这就是你想要的吗??
int x = 10;
std::shared_ptr<int*> ptr = std::make_shared<int*>(&x);
**ptr = 11;
std::cout<< x << " " << **ptr;
,
shared_ptr<int> ptr = make_shared<int>(x);
make_shared<int>
构造一个 int
类型的对象,并使用 args 作为 std::shared_ptr
的构造函数的参数列表将其包装在 int
中。所以它的int
值就是x
的value;它没有指向 x
。
它等于:
shared_ptr<int> ptr = make_shared<int>(10);
--
此外,当共享指针时,我需要更改 x 的值 改变了。
您可以简单地将 x
设为 shared_ptr<int>
并共享它。或者你甚至可以直接反弹 x 参考:&x
。所以在任何地方都可以修改。没有?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。