Cheguei ao C e C++ vindo do Assembly antes de 2,5 décadas.
Herdei algumas coisas implícitas no assembly, tanto para C quanto para C++, mas depois percebi que essas coisas são, na verdade, um comportamento indefinido.
Uma delas foi a diferença entre delete ptr
e delete[] array
which para o sistema operacional geralmente é uma chamada porque não há destruidores.
Minha última suposição é o seguinte código:
std::byte *a = new std::byte[10];
short *b = reinterpret_cast<short*>(a);
delete[] b;
Esse comportamento é indefinido? Não existem destruidores.
Sim, é um comportamento indefinido. O tipo dado à
delete[]
expressão deve ser semelhante ao tipo real do objeto ao qual ela se refere." semelhante " significa essencialmente que só pode diferir em
const
qualificações.Da mesma forma, fazer quase qualquer outra coisa
b
(exceto convertê-lo de volta parastd::byte*
) terá um comportamento indefinido. Esse tipo dereinterpret_cast
situação geralmente termina em comportamento indefinido. Existem apenas alguns casos de uso muito específicos que estão bem definidos.Em C++, ao contrário do assembly, existe um modelo de objeto e você precisa pensar em termos desses objetos que contêm valores específicos para seu tipo, não em termos de locais de memória que contêm bits não digitados que podem ser interpretados como qualquer tipo para qualquer operação .