C ++ позволяет использовать delete
для переменных, которые в то время были указателями на неполные типы.
struct S; // incomplete
int main() {
S* s = NULL;
delete s; // legal
}
Компилятор не знает, что на самом деле означает S
. Если выясняется, что S
имеет нетривиальный деструктор, компилятору не требуется обнаруживать эту проблему.
На практике, вероятно, случается, что когда компилятор встречает инструкцию delete
для неполного типа, он выполняет вызов того, что, как он ожидает, будет обычным деструктором, генерируемым компилятором по умолчанию. И если таковым оказывается деструктор, то все в порядке. Но если окажется, что S
имеет нетривиальный деструктор, или если он предоставляет свой собственный специальный метод удаления, то то, что заполнял компилятор ранее, будет неверным. Однако компилятор позволил предположить, что он правильно скомпилировал инструкцию delete
, и никогда не оглядываться назад. Когда это предположение неверно, вы получите неопределенное поведение.
Функция Boost гарантирует, что она вызывается только для полных типов, что позволяет избежать неопределенного поведения, которое может возникнуть у неполных типов.