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

Initialization of dynamically allocated structures using shared pointer

我不明白为什么需要这样初始化动态分配的结构(使用共享指针) 只是为了通知我正在使用 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(即使 make_shared 指向 struct Meme),所以初始化列表无法推断出它应该转换为 struct Meme?

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

Make shared_ptr

Allocates and constructs an object of type T passing args to its constructor, and returns an object of type shared_ptr that owns and stores a pointer to it (with a use count of 1).

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

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

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

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);