使用共享指针初始化动态分配的结构
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);
我不明白为什么需要这样初始化动态分配的结构(使用共享指针) 只是为了通知我正在使用 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);