Partilhar via


Aviso C26417

O parâmetro de ponteiro compartilhado é passado por referência e não redefinido ou reatribuído. Use T* ou T& em vez disso.

Diretrizes principais do C++: R.35: Use um parâmetro shared_ptr<widget>& para expressar que uma função pode redefinir o ponteiro compartilhado

Passar ponteiros partilhados por referência pode ser útil em cenários em que o código invocado atualiza o alvo do objeto smart pointer, e espera-se que o chamador veja essas atualizações. Usar uma referência apenas para reduzir os custos de passar um ponteiro partilhado é questionável. Se o código chamado apenas acessa o objeto de destino e nunca gerencia o seu ciclo de vida, é mais seguro passar um ponteiro bruto ou referência, em vez de expor detalhes de gerenciamento de recursos.

Observações

  • Esta verificação reconhece std::shared_pointer e tipos definidos por utilizador que provavelmente se comportarão como ponteiros partilhados. As seguintes características são esperadas para ponteiros compartilhados definidos pelo usuário:

  • operadores de desreferenciação ou acesso de membros sobrecarregados (públicos e não excluídos);

  • um construtor de cópias ou um operador de atribuição de cópias (público e não excluído);

  • um destrutor público que não é eliminado ou predefinido. Os destrutores vazios ainda são contados como definidos pelo utilizador.

  • A ação de redefinir ou reatribuir é interpretada de forma mais genérica:

  • qualquer chamada a uma função não constante num ponteiro compartilhado pode potencialmente reinicializar o ponteiro;

  • Qualquer chamada para uma função que aceite uma referência a um ponteiro compartilhado não constante pode potencialmente redefinir ou reatribuir esse ponteiro.

Exemplos

complicação desnecessária da interface

bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e))
        e = std::make_shared<event>(e->id());
    // ...
}

Complicação de interface desnecessária - simplificada

bool unregister(const event *e)
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e.get()))
        e = std::make_shared<event>(e->id());
    // ...
}