Está usando assert () na má prática do C ++?

Eu tenho a tendência de adicionar muitas asserções ao meu código C ++ para facilitar a depuração sem afetar o desempenho das compilações de versões. Agora,assert é uma macro C pura projetada sem mecanismos C ++ em mente.

C ++, por outro lado, definestd::logic_error, que se destina a ser lançado nos casos em que há um erro na lógica do programa (daí o nome). O lançamento de uma instância pode ser a alternativa perfeita, mais C ++ ish paraassert.

O problema é queassert eabort ambos terminam o programa imediatamente sem chamar destruidores, ignorando, portanto, a limpeza, enquanto lançar uma exceção adiciona manualmente custos de tempo de execução desnecessários. Uma maneira de contornar isso criaria uma própria macro de asserçãoSAFE_ASSERT, que funciona como o C, mas lança uma exceção no fracasso.

Eu posso pensar em três opiniões sobre este problema:

Atenha-se ao C afirma. Como o programa é finalizado imediatamente, não importa se as alterações estão desenroladas corretamente. Além disso, usando#defines em C ++ é tão ruim.Lança uma exceção e pega no main (). Permitir que o código ignore os destruidores em qualquer estado do programa é uma má prática e deve ser evitado a todo custo, assim como as chamadas para terminate (). Se exceções forem lançadas, elas devem ser capturadas.Lance uma exceção e deixe terminar o programa. Uma exceção que encerra um programa é ok, e devido aNDEBUG, isso nunca acontecerá em uma compilação de lançamento. A captura é desnecessária e expõe detalhes de implementação do código interno paramain().

Existe uma resposta definitiva para este problema? Qualquer referência profissional?

Editado: Pular destruidores, é claro, não tem comportamento indefinido.

questionAnswers(5)

yourAnswerToTheQuestion