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