Выделенное хранилище может быть меньше, чем требование выравнивания объекта
Этот дефект возникает, когда вы не должным образом перегружаете оператора 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 not perloaded для возможно переопределенного класса не повышает дефект, если вы не перегрузите оператор 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 или более раннюю версию Standard, передайте требование выравнивания по выровненным типам оператору new/new[]
путем перегрузки оператора.
Группа: Объектно-ориентированная |
Язык: C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: MISSING_OVERLOAD_NEW_FOR_ALIGNED_OBJ |
Влияние: Средний |