Нет, это отчасти причина того, что в стандарте существует неопределенное / определяемое реализацией поведение.Неопределенное поведение не обязательно будет одинаковым для нескольких компиляций одного и того же исходного кода на одном компьютере (скажем, с разными флагами оптимизации).
Комитет явно предпочитает четко определенное поведение.Поведение, определяемое реализацией, существует, когда комитет считает, что для некоторой концепции существует несколько реализаций, и во всех случаях нет причин предпочитать одну реализацию другой.Неопределенное поведение существует, когда комитет считает, что слишком сложно выполнять какие-либо обещания при разумной реализации.
Во многих случаях неопределенное поведение реализуется как нечто без проверки.Тогда поведение зависит от операционной системы, если она есть и если она замечает что-то менее кошерное.
Например, разыменование памяти, которой вы не владеете, не определено.В общем, ОС убьет вашу программу, если вы это сделаете.Однако, если звезды выровнены правильно, вам может понадобиться разыменовать память, которой вы не владеете в соответствии с правилами C ++ (например, вы не получили ее от new
или вы уже delete
d), но чтоОС считает, что вы владеете.Иногда происходит сбой, а иногда вы просто повреждаете память где-то еще в вашей программе, а иногда вы уходите незамеченными (например, если память не была возвращена).
Гоночные условия считаются неопределенными, и они печально известны тем, что отличаются во время разных запусков программы.Вы, вероятно, будете вести себя по-разному каждый раз, когда разбиваете свой стек, если ваша операционная система этого не замечает.
Double delete
s не определены.Как правило, они приводят к сбоям, но тот факт, что они не определены, означает, что вы не можете полагаться на сбой.