Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

<memory>

shared_ptr – třída