make_shared (<memory>)
创建并返回指向分配对象的 shared_ptr,这些对象是通过使用默认分配器从零个或多个参数构造的。 分配并构造指定类型的对象和shared_ptr来管理对象的共享所有权,并返回shared_ptr。
template<class Type, class... Types> shared_ptr<Type> make_shared( Types&&... _Args );
参数
参数 |
描述 |
---|---|
_Args |
零个或多个构造函数参数。 函数根据所提供的参数来推断要调用的构造函数重载。 |
属性值/返回值
返回指向分配和构造的对象的shared_ptr。
备注
使用make_shared作为创建对象的简单、更高效的方法,以及一个shared_ptr来同时管理对对象的共享访问。 在语义上,这两个语句是等效的:
auto sp = std::shared_ptr<Example>(new Example(argument));
auto msp = std::make_shared<Example>(argument);
但是,第一条语句进行了两个分配,如果在Example对象的分配成功后,shared_ptr的分配失败,则未命名的Example对象将被泄漏。 使用make_shared的语句更简单,因为只涉及到一个函数调用。 这样会更有效,因为库可能会对对象和智能指针进行一个分配。 这样既更快,又产生较少内存碎片,并且除了另一个以外,这个资源分配不可能出现异常。 通过使引用对象和更新智能指针中的引用计数的代码具有的更好的地址来提高性能。
如果您不需要共享访问对象,请考虑使用 make_unique。 如果您需要为对象指定自定义的分配器,请使用 allocate_shared。 如果您的对象需要自定义删除器,您不能使用make_shared,因为无法将删除器作为参数传递。
以下示例演示如何通过调用特定构造函数重载来创建指向类型的共享指针。
示例
// stl_make_shared.cpp
// Compile by using: cl /W4 /EHsc stl_make_shared.cpp
#include <iostream>
#include <string>
#include <memory>
#include <vector>
class Song {
public:
std::wstring title_;
std::wstring artist_;
Song(std::wstring title, std::wstring artist) : title_(title), artist_(artist) {}
Song(std::wstring title) : title_(title), artist_(L"Unknown") {}
};
void CreateSharedPointers() {
// Okay, but less efficient to have separate allocations for
// Song object and shared_ptr control block.
auto song = new Song(L"Ode to Joy", L"Beethoven");
std::shared_ptr<Song> sp0(song);
// Use make_shared function when possible. Memory for control block
// and Song object are allocated in the same call:
auto sp1 = std::make_shared<Song>(L"Yesterday", L"The Beatles");
auto sp2 = std::make_shared<Song>(L"Blackbird", L"The Beatles");
// make_shared infers which constructor to use based on the arguments.
auto sp3 = std::make_shared<Song>(L"Greensleeves");
// The playlist vector makes copies of the shared_ptr pointers.
std::vector<std::shared_ptr<Song>> playlist;
playlist.push_back(sp0);
playlist.push_back(sp1);
playlist.push_back(sp2);
playlist.push_back(sp3);
playlist.push_back(sp1);
playlist.push_back(sp2);
for (auto&& sp : playlist) {
std::wcout << L"Playing " << sp->title_ <<
L" by " << sp->artist_ << L", use count: " <<
sp.use_count() << std::endl;
}
}
int main() {
CreateSharedPointers();
}
此示例产生以下输出:
要求
标头: <memory>
命名空间: std