new e make_shared para ponteiros compartilhados
Me depareiesta post e uma das respostas de @kerek SB afirma
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
No seu código, a segunda variável é apenas um ponteiro nu, não um ponteiro compartilhado.
Agora na carne. O make_shared é (na prática) mais eficiente, porque aloca o bloco de controle de referência junto com o objeto real em uma única alocação dinâmica. Por outro lado, o construtor para shared_ptr que usa um ponteiro de objeto nu deve alocar outra variável dinâmica para a contagem de referência. A desvantagem é que make_shared (ou seu primo assignate_shared) não permite especificar um deleter personalizado, pois a alocação é realizada pelo alocador.
(Isso não afeta a construção do próprio objeto. Da perspectiva do objeto, não há diferença entre as duas versões. O mais eficiente é o ponteiro compartilhado em si, não o objeto gerenciado.)
Agora eu tenho duas perguntas sobre este post e gostaria que alguém esclarecesse isso
Por que o segundo não é um ponteiro compartilhado? Isso não incrementará uma contagem de referência
Como o make_shared faz apenas uma alocação de memória e o novo torna dois, tornando o make_shared mais eficaz?
Um pequeno esclarecimento sobre isso seria apreciado.