共享Ptr与普通Ptr:声明后的对象创建

时间:2015-05-19 23:38:23

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

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

#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;
}

为什么我们不能为共享指针创建新对象?有办法吗?

2 个答案:

答案 0 :(得分:3)

std::shared_ptr<node> n(new node);
n.reset(new node);
n = std::make_shared<node>();

您应该prefer make_shared

答案 1 :(得分:1)

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

解决这个问题:

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

或者:

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