Comportamento definido pela implementação e comportamento indefinido
O padrão C ++ é muito específico sobre os efeitos de várias construções e, em particular, você deve estar sempre ciente destas categorias de problemas :
Comportamento indefinido significa que não há absolutamente nenhuma garantia dada. O código pode funcionar, ou pode atear fogo ao seu disco rígido ou fazer demônios voarem pelo seu nariz . No que diz respeito à linguagem C ++, absolutamente tudo pode acontecer. Em termos práticos, isso geralmente significa que você tem um bug irrecuperável. Se isso acontecer, você não pode realmente confiar em nada sobre seu aplicativo (porque um dos efeitos desse comportamento indefinido pode ter sido apenas bagunçar a memória usada pelo resto do seu aplicativo). Não é necessário que seja consistente, portanto, executar o programa duas vezes pode gerar resultados diferentes. Pode depender das fases da lua, da cor da camisa que você está vestindo ou de qualquer outra coisa.
Comportamento não especificado significa que o programa deve fazer algo lógico e consistente, mas não é necessário documentar isso.
O comportamento definido pela implementação é semelhante ao não especificado, mas também deve ser documentado pelos escritores do compilador. Um exemplo disso é o resultado de a reinterpret_cast
. normalmente , ele simplesmente muda o tipo de um ponteiro, sem modificar o endereço, mas o mapeamento é realmente definido pela implementação, então um compilador poderia mapear para um endereço completamente diferente, desde que documentasse essa escolha. Outro exemplo é o tamanho de um int. O padrão C ++ não se importa se tem 2, 4 ou 8 bytes, mas deve ser documentado pelo compilador
Mas o comum para todos esses é que é melhor evitá-los. Quando possível, mantenha o comportamento 100% especificado pelo próprio padrão C ++. Dessa forma, você tem portabilidade garantida.
Freqüentemente, você também precisa confiar em algum comportamento definido pela implementação. Pode ser inevitável, mas você ainda deve prestar atenção a isso e estar ciente de que está contando com algo que pode mudar entre diferentes compiladores.
O comportamento indefinido, por outro lado, deve sempre ser evitado. Em geral, você deve apenas assumir que isso faz seu programa explodir de uma forma ou de outra.