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.

questionAnswers(4)

yourAnswerToTheQuestion