Выделенное устройство хранения данных может быть меньшего размера, чем объектное требование выравнивания
Этот дефект происходит, когда вы не соответственно перегружаете оператор new/new[] и вы используете этот оператор, чтобы создать объект с требованием выравнивания, заданным с alignas. Средство проверки повышает дефект для этих версий броска и неброска оператора new/new[].
void* operator new(std::size_t size)
void* operator new(std::size_t size, const std::nothrow_t&)
void* operator new[](std::size_t size)
void* operator new[](std::size_t size, const std::nothrow_t&)
Использование alignas указывает, что вы не ожидаете оператор по умолчанию new/new[] удовлетворить требованию выравнивания или объекту, и что объект возможно по выровненному. Тип по выровненному, если вы используете alignas сделать требование выравнивания типа больше, чем std::max_align_t. Например, foo по выровненному в этом фрагменте кода, потому что его требование выравнивания составляет 32 байта, но std::max_align_t имеет выравнивание 16 байтов в большинстве реализаций.
struct alignas(32) foo {
char elems[32];
} |
Оператор, новый не перегруженный для возможно сверхвыровненного класса, не повышает дефекта, если вы не перегружаете оператор new/new[] и вы используете версию C++ 17 или позже Стандарта. Оператор по умолчанию new/new[] на C++ 17 или более поздние поддержки по выравниванию путем передачи требования выравнивания в качестве аргумента типа std::align_val_t, например, void* operator new(std::size_t size, std::align_val_t alignment).
Оператор по умолчанию new/new[] выделяет устройство хранения данных с требованием выравнивания std::align_val_t самое большее. Если вы не перегружаете оператор, когда вы создаете объект с по выровненному типу, полученный объект может быть неправильно выровнен. Доступ к этой объектной силе вызывает ошибки несанкционированного доступа или аварийные завершения программы.
Если вы используете версию C++ 14 или ранее Стандарта, передаете требование выравнивания по выровненным типам к оператору new/new[] путем перегрузки оператора.
| Группа: объектно-ориентированный |
| Язык: C++ |
| Значение по умолчанию: на |
Синтаксис командной строки:
MISSING_OVERLOAD_NEW_FOR_ALIGNED_OBJ |
| Удар: носитель |