使用共享指针初始化动态分配的结构

时间:2019-05-11 13:46:45

标签: initialization structure shared-ptr dynamic-memory-allocation initializer-list

我不明白为什么需要这样进行动态分配结构的初始化(使用共享的ptr) 只是通知我我正在使用C ++ 11

如果我们有这样的结构

struct Meme {
   std::string s;
   Meme* p;
}

以及随后的代码中,我需要使用shared_ptr为该结构动态分配内存,但是我需要对结构进行即时初始化。 为什么这样做呢?

std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});

让我感到困惑的部分是这个:

std::make_shared<Meme>(Meme{imena.at(i),nullptr});

如果我们将shared_ptr设置为指向struct Meme,为什么我们需要再次声明初始化列表是针对struct Meme的

(Meme{imena.at(i),nullptr})

为什么这不起作用:

std::shared_ptr<Meme> novi=std::make_shared<Meme>({imena.at(i),nullptr});

也许这是初始化列表无法推断出它应该转换为struct Meme的原因,因为没有直接使用struct Meme(即使make_shared指向struct Meme)?

1 个答案:

答案 0 :(得分:0)

make_shared将参数转发给构造函数。

  

设为shared_ptr

     

分配并构造一个T类型的对象,将args传递给其构造函数,并返回一个拥有并存储指向它的指针(使用计数为1)的shared_ptr类型的对象。 >

这会从您使用Meme创建的新实例中调用Meme{imena.at(i),nullptr}的副本构造函数。

std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});

使用make_shared从转发的参数构造它的正确方法是在struct中创建构造器:

struct Meme {
    std::string s;
    Meme* p;
    Meme(const std::string& s, Meme* p) : s(s), p(p) {}
};

std::shared_ptr<Meme> novi = std::make_shared<Meme>(imena.at(i),nullptr);

您还可以使用(默认)空构造函数创建一个实例,然后设置其成员:

struct Meme {
    std::string s;
    Meme* p = nullptr;
};

std::shared_ptr<Meme> novi = std::make_shared<Meme>;
novi->s = imena.at(i);