Новое размещение должно использоваться только с правильно выровненными указателями для достаточной емкости хранения
Новое размещение должно использоваться только с правильно выровненными указателями для достаточной емкости хранения.
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.Средство проверки не учитывает указатели, которые являются предварительно выделенной памятью в куче, поскольку доступное хранилище зависит от доступности памяти, которая известна только во время выполнения.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека поддержки языка |
| Категория: Обязательно, Автоматизировано |