Новое размещение должно использоваться только с правильно выровненными указателями на достаточную емкость памяти
Новое размещение должно использоваться только с правильно выровненными указателями на достаточную емкость памяти.
new
оператор выделяет необходимое количество памяти для того, чтобы хранить объект на куче и создает новый объект в выделенной памяти в одной операции. Если вы хотите разделить выделение и конструкцию и поместить объект в предварительно выделенную память или на стеке или на куче, вы используете размещение new
. Размещение new
имеет преимущества перед new
в определенных ситуациях, например, когда необходимо поместить объект в известной ячейке памяти.
new
оператор автоматически выделяет правильную сумму выровненной памяти, которой требует объект. Но при использовании размещения new
, необходимо вручную убедиться, что указатель, который вы передаете, имеет достаточную выделенную емкость памяти и правильно выравнивается. Нарушение этих ограничений приводит к конструкции объекта в неправильно выровненном местоположении или инициализации памяти за пределами выделенных границ, которые могут привести к неожиданному или зависящему от реализации поведению.
Предположим что указатель ptr
предварительно выделенный m
байты памяти на стеке и имеют выравнивание n
. Например, если ptr
массив:
uint8_t ptr[5];
sizeof(uint8_t) * 5
и выравниванием является alignof(uint8_t)
. Если вы выделяете больше, чем m
байты к этому указателю в размещении new
выражение или если выравнивание, требуемое для выделения, больше n
, средство проверки повышает нарушение. При определении выравнивания указателя средство проверки учитывает явные выравнивания такой как с std::align
.Средство проверки не рассматривает указатели, которые являются предварительно выделенной памятью на куче, поскольку доступное устройство хранения данных зависит от доступности памяти, которая известна только во время выполнения.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: вспомогательная библиотека Языка |
Категория: необходимый, автоматизированный |