【问题标题】:Make shared pointer point to a variable使共享指针指向一个变量
【发布时间】:2021-08-21 06:36:38
【问题描述】:

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

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

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

【问题讨论】:

  • "ptr 指向 x" - 不,它不是(而且它永远不会)。它指向由make_shared&lt;int&gt; 分配 的对象。该对象的 x 通过 make_shared&lt;int&gt;(x) 的构造函数 arg 部分提供。据我所知,x 在这里毫无意义。如果你想要一堆引用它的指针,简单的int * 就足够了(但我已经怀疑它会解决你真正遇到的任何潜在问题)。
  • 您尝试做的事情是不明智的。如果您正在尝试学习如何使用共享指针,那么这不是您使用它们的方式。如果您认为这是解决某些特定问题的正确方法,您需要向我们解释该问题是什么。共享指针的目的是管理对象的生命周期,而您的 x 对象的生命周期已经由它具有范围这一事实控制。
  • 最好不要将“智能指针”视为指针。

标签: c++ c++11 pointers shared-ptr


【解决方案1】:

您误解了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和共享指针ptr。两者都拥有该动态int 的平等和共享所有权。当其中任何一个被销毁时,资源仍然存在,因为它仍然被剩余的共享指针引用。当 last 未完成的引用被销毁时,动态的 int 也会被销毁。

【讨论】:

  • 你说的都是正确有用的;您可以添加“所有权”是“完成后删除的责任”的密码。这将使智能指针的主要目的更清楚:控制对象的生命周期;由此自然而然地得出为什么持有指向生命周期已经由其他方式确定的对象的智能指针没有意义,这是一个矛盾,并且如果你成功(你可以)将是灾难性的。
【解决方案2】:

make_share 使用传递给它的参数构造一个新对象。在这种情况下,它是 x 我猜你需要shared_ptr&lt;int*&gt;。这就是你想要的吗??

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

【讨论】:

  • 这样做有什么意义?您可以通过将 x 声明为 shared_ptr. 的引用 (&x) 来反弹 x
【解决方案3】:
shared_ptr<int> ptr = make_shared<int>(x);

make_shared&lt;int&gt; 构造一个int 类型的对象并将其包装在std::shared_ptr 中,使用args 作为int 的构造函数的参数列表。所以它的int 的值就是xvalue;它不指向x

等于:

shared_ptr<int> ptr = make_shared<int>(10);

--

当共享指针时,我还需要更改 x 的值 改变了。

您可以简单地将x 制作成shared_ptr&lt;int&gt; 并分享。或者你甚至可以直接反弹 x-reference:&amp;x。所以在任何地方都可以修改。没有?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多