Eu tomo conta de alguns sistemas em C++ que reescrevemos para evitar o uso de ponteiros “nus” (ou seja, *).
Sempre usamos const string& em vez de const char *, só para ter uma idéia.
Em 95% do código trocamos tudo por shared_ptr<>.
Se olhar os sistemas, parecem com Java escrito em C++ (ha ha ha).
Isso praticamente removeu alguns problemas como vazamento de memórias e acesso ilegal a memória, tudo porque agora tudo é bem controlado.
E o desempenho não foi muito afetado por causa disso.
Isso porque o compilador, se bem orientado, consegue compensar tais coisas como uso de métodos virtuais, que normalmente penalizam a execução de programas em C++ se o compilador não for esperto o suficiente para saber que ele pode “desligar” a herança virtual dependendo da análise de fluxo do programa.
Quando um desenvolvedor aqui resolveu usar um ponteiro “nu” (por descuido) deu o maior rolo, porque ele se esqueceu de deletar a memória que havia alocado, e foi estourar a memória em produção, o que foi um verdadeiro escândalo. Depois demos a maior bronca nele. Agora ele não faz mais isso.