make_shared (<memory>)
Vytváří a vrací shared_ptr odkazující na alokované objekty vytvořené z nuly nebo více argumentů pomocí výchozího alokátoru.Přidělení a vytvoří obou objekt zadaného typu a shared_ptr pro správu sdílených vlastnictví objektu a vrátí shared_ptr.
template<class Type, class... Types> shared_ptr<Type> make_shared( Types&&... _Args );
Parametry
Parametr |
Popis |
---|---|
_Args |
Nula nebo další argumenty konstruktoru.Funkce odvodí, které přetížení konstruktoru bude vyvoláno na základě poskytnutých argumentů. |
Hodnota vlastnosti / návratová hodnota
Vrátí hodnotu shared_ptr který odkazuje na přidělené a konstruovaný objekt.
Poznámky
Použití make_shared jako jednoduchý a efektivnější způsob pro vytvoření objektu a shared_ptr ke správě sdílený přístup k objektu současně.Sémanticky jsou tyto dva příkazy ekvivalentní:
auto sp = std::shared_ptr<Example>(new Example(argument));
auto msp = std::make_shared<Example>(argument);
Však první příkaz usnadňuje dvě přidělení a pokud rozdělení shared_ptr se nezdaří po rozdělení Example objektu proběhla úspěšně, pak nemusí Example byly prozrazeny objektu.Příkaz, který používá make_shared je jednodušší, protože je potřebný volání funkce pouze jeden.Je efektivnější, protože knihovny můžete vytvořit jednu přidělení pro objekt a inteligentní ukazatel myši.To je rychlejší a vede k menší fragmentace paměti a neexistuje možnost výjimky na jeden přidělení, ale ne na druhou.Podle lepší místo pro kód, který odkazuje na objekt a aktualizace, které vrátí odkaz na v inteligentní ukazatel myši nad vyšší výkon.
Zvažte použití make_unique Pokud nepotřebujete sdílený přístup k objektu.Použití allocate_shared Pokud je třeba zadat vlastní přidělování pro objekt.Nelze použít make_shared při objekt vyžaduje vlastní deleter, protože neexistuje způsob předávání deleter jako argument.
Následující příklad ukazuje, jak vytvořit sdílené odkazy na typ vyvoláním konkrétního konstruktoru přetížení.
Příklad
// 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();
}
V příkladu vytvoří tento výstup:
Požadavky
Záhlaví: < paměti >
Obor názvů: std