Partilhar via


make_shared (<memory>)

Cria e retorna um shared_ptr que aponta para os objetos alocados construídos a partir do zero ou mais argumentos usando o alocador padrão. Aloca e constrói os dois um objeto do tipo especificado e um shared_ptr para gerenciar compartilham a propriedade do objeto e retorna o shared_ptr.

template<class Type, class... Types>     shared_ptr<Type> make_shared(         Types&&... _Args     );

Parâmetros

Parâmetro

Descrição

_Args

Zero ou mais argumentos de construtor. A função infere qual sobrecarga de construtor para chamar com base nos argumentos fornecidos.

Valor da propriedade/valor de retorno

Retorna um shared_ptr que aponta para o objeto alocado e construído.

Comentários

Use make_shared como uma forma simples e mais eficiente para criar um objeto e um shared_ptr para gerenciar o acesso compartilhado para o objeto ao mesmo tempo. Semanticamente, essas duas instruções são equivalentes:

   auto sp = std::shared_ptr<Example>(new Example(argument));
   auto msp = std::make_shared<Example>(argument);

No entanto, a primeira instrução faz duas alocações e se a alocação do shared_ptr falhar após a alocação do Example objeto foi bem-sucedida, em seguida, sem nome Example objeto é perdido. A instrução que usa make_shared é mais simples porque há apenas uma função chamada envolvidas. É mais eficiente porque a biblioteca pode fazer uma única alocação do objeto e o ponteiro inteligente. Isso é mais rápido e resulta em menos fragmentação da memória e não há nenhuma possibilidade de uma exceção em uma alocação, mas não o outro. Desempenho é melhorado pela localidade melhor para o código que faz referência a objeto e atualizações de que contagens de referência no ponteiro inteligente.

Considere o uso de make_unique se não precisar de acesso compartilhado para o objeto. Use allocate_shared se você precisar especificar um alocador personalizado para o objeto. Não é possível usar make_shared se o objeto requer um deleter personalizado, porque não há nenhuma maneira de passar o deleter como um argumento.

O exemplo a seguir mostra como criar compartilhados ponteiros para um tipo, chamando as sobrecargas do construtor específico.

Exemplo

// 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();
}

O exemplo produz esta saída:

  

Requisitos

Cabeçalho: < memória >

Namespace: std

Consulte também

Referência

<memory>

Classe shared_ptr