【问题标题】:Shared Ptr vs Normal Ptr: Object Creation After DeclarationShared_ptr vs Normal Ptr:声明后创建对象
【发布时间】:2015-05-19 23:38:23
【问题描述】:

使用普通指针,我可以声明一个指针,然后将其设置为等于一个新对象,但是使用共享指针我无法做到这一点。为什么?

#include <memory>
struct node{
    int num;
    node* next;
};
int main()
{
    std::shared_ptr<node> new_node1 = NULL; // WORKS
    new_node1 = new node;   // ERROR, why?
    node* new_node2 = NULL; //WORKS
    new_node2 = new node;   //WORKS

    return 0;
}

为什么我们不能为共享指针创建一个新对象?有没有办法做到这一点?

【问题讨论】:

  • 我将如何使用 reset() 来做到这一点?
  • new_node1.reset (new node);new_node1 = std::make_shared &lt;node&gt; ();
  • 只需点击一下即可解决。懒惰:\
  • 对您的第一个问题的简短回答是,如果您可以轻松做到这一点,将会发生可怕的事情。考虑Foo *f = new Foo(); bar(f); bar(f);。现在,如果bar 采用std::shared_ptr&lt;Foo&gt; 会发生什么? (想想临时共享指针的销毁。)您想确定在何时何地构造shared_ptr,因为它接管了对底层对象生命周期的控制。

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


【解决方案1】:
std::shared_ptr<node> n(new node);
n.reset(new node);
n = std::make_shared<node>();

你应该prefer make_shared

【讨论】:

    【解决方案2】:

    这是因为在operator=() 调用期间将调用的构造函数被标记为explicit

    要解决这个问题:

    new_node1 = std::shared_ptr<node>(new node);
    

    或者:

    new_node1 = std::make_shared<node>();
    

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2023-04-09
      • 2011-03-04
      • 2018-04-18
      • 2021-07-26
      • 2016-12-15
      • 2020-04-28
      • 2014-09-24
      相关资源
      最近更新 更多