Как обычно в C ++ Standard, когда ничего явно не указано, нарушение требований приводит к неопределенному поведению. Обязательно означает, что всегда должно , это требование, а не опция в C ++ Standard.
Например, вот что MSDN говорит :
Указатель _Ptr должен был быть возвращен ранее вызовом для выделения объекта распределителя, который сравнивается равным * this, выделяя объект массива того же размера и типа.
, что означает, что размер должен точно соответствовать, иначе вы столкнетесь с неопределенным поведением.