Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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_pointere 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());
// ...
}