foi um construtor bruto-ponteiro de shared_ptr um erro?
Em retrospectiva, dada amake_shared
, seriashared_ptr
tem um construtor que usa um ponteiro bruto se ele tivesse sido introduzido no C ++ 11?
Existem argumentos fortes ou casos de uso em favor desse construtor?
Teria evitado a armadilha bem documentada deexceção-segurança e aalocação de memória / vantagem de desempenho de usarmake_shared
.
Eu acredito que outra vantagem de exigirshared_ptr
construção viamake_shared
seria que ele poderia ser um ponteiro único embaixo do capô, diminuindo o uso de memória e criando coisas comoatomic_compare_exchange muito mais simples (e possivelmente mais eficiente). (Vejoapresentação do C ++ Now)
EDITAR
Eu entendo que um shared_ptr que basicamente é um intrusive_ptr (com o objeto e o bloco de controle coalescidos) não apresentaria os recursos que o std :: shared_ptr atual possui. Gostar:
a capacidade de liberar o objeto separadamente do bloco de controle (o que é bom se você viver por muito tempo fraco_ptrs)
compatibilidade com bibliotecas que fornecem ponteiros brutos e a responsabilidade de liberá-los
a capacidade de reter recursos arbitrários com deleters personalizados (ou sem deleter, para ponteiros não proprietários)
a capacidade de apontar para um subobjeto (por exemplo, um membro) enquanto mantém o objeto pai ativo.
O que estou sugerindo é que esses recursos podem não ser usados com bastante frequência (ou, no caso de usá-lo como empacotador de raii), podem não ser os mais adequados, para garantir o custo extra:
um ponteiro separado para o bloco de controle(potencialmente) lógica atomic_compare_exchange mais complexa, pode não valer a pena.Em um mundo C ++ 98 (onde o shared_ptr foi introduzido), make_shared é menos prático e menos amigável (a falta de encaminhamento perfeito requer wrappers de referência e a falta de modelos variados torna a implementação desajeitada).