21 Language support library [language.support]

21.6 Dynamic memory management [support.dynamic]

21.6.2 Storage allocation and deallocation [new.delete]

Если не указано иное, положения[basic.stc.dynamic] применяются к библиотечным версиямoperator new иoperator delete. Если значение аргумента выравнивания, переданное любой из этих функций, не является допустимым значением выравнивания, поведение не определено.

21.6.2.1 Single-object forms [new.delete.single]

void* operator new(std::size_t size); void* operator new(std::size_t size, std::align_val_t alignment);

Effects: allocation functions Вызывается new-expression выделить size байт памяти. Вторая форма вызывается для типа с новым расширенным выравниванием и выделяет память с указанным выравниванием. Первая форма вызывается иначе и выделяет память, выровненную соответствующим образом, для представления любого объекта такого размера, при условии, что тип объекта не имеет выравнивания «новое-расширенное».

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Required behavior: Вернуть ненулевой указатель на соответствующим образом выровненный storage ([basic.stc.dynamic]) или выдать исключение. Это требование является обязательным для любых заменяющих версий этих функций.bad_­alloc

Default behavior:

  • Выполняет цикл: внутри цикла функция сначала пытается выделить запрошенную память. Включает ли попытка вызов функций стандартной библиотеки C malloc илиaligned_­alloc не определена.

  • Возвращает указатель на выделенное хранилище, если попытка успешна. В противном случае, если currentnew_­handler ([get.new.handler]) является значением нулевого указателя, бросает bad_­alloc.

  • В противном случае функция вызывает текущую new_­handler функцию. Если вызванная функция возвращается, цикл повторяется.

  • Цикл завершается, когда попытка выделить запрошенное хранилище успешна или когда вызываемая new_­handler функция не возвращает.

void* operator new(std::size_t size, const std::nothrow_t&) noexcept; void* operator new(std::size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept;

Effects: То же, что и выше, за исключением того, что они вызываются версией размещения, new-expression когда программа C ++ предпочитает результат нулевого указателя в качестве индикации ошибки, а не bad_­alloc исключения.

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Required behavior: Верните ненулевой указатель на соответствующим образом выровненный storage ([basic.stc.dynamic]) или верните нулевой указатель. Каждая из этих версий nothrow operator new возвращает указатель, полученный, как если бы он был получен от (возможно, замененной) соответствующей функции без размещения. Это требование является обязательным для любых заменяющих версий этих функций.

Default behavior: Звонкиoperator new(size), илиoperator new(size, alignment)соответственно. Если вызов возвращается нормально, возвращает результат этого вызова. В противном случае возвращает нулевой указатель.

[Example:

T* p1 = new T;                  // throws bad_­alloc if it fails
T* p2 = new(nothrow) T;         // returns nullptr if it fails

end example]

void operator delete(void* ptr) noexcept; void operator delete(void* ptr, std::size_t size) noexcept; void operator delete(void* ptr, std::align_val_t alignment) noexcept; void operator delete(void* ptr, std::size_t size, std::align_val_t alignment) noexcept;

Effects: Вызывается deallocation functions объектом, delete-expression чтобы сделать значениеptr недопустимым.

Replaceable: Программа C ++ может определять функции с любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++. Если функция безsize параметра определена, программа также должна определить соответствующую функцию сsize параметром. Если функция сsize параметром определена, программа также должна определить соответствующую версию безsize параметра. [ Note: Приведенное ниже поведение по умолчанию может измениться в будущем, что потребует замены обеих функций освобождения при замене функции распределения. ]end note

Requires: ptr должен быть нулевым указателем или его значение должно представлять адрес блока памяти, выделенного более ранним вызовом (возможно, замененного) operator new(std​::​size_­t) или operator new(std​::​size_­t, std​::​align_­val_­t) который не был аннулирован промежуточным вызовом operator delete.

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Requires: Еслиalignment параметр отсутствует, ptr функция распределения должна вернуть его безalignment параметра. Если присутствует,alignment аргумент должен быть равенalignment аргументу, переданному возвращенной функции распределенияptr. Если присутствует,size аргумент должен быть равенsize аргументу, переданному возвращенной функции распределенияptr.

Required behavior: Вызов объектаoperator delete сsize параметром может быть изменен на вызов соответствующего объектаoperator delete безsize параметра, не влияя на выделение памяти. [ Note: Соответствующая реализация предназначена для operator delete(void* ptr, std​::​size_­t size) простого вызова operator delete(ptr). ]end note

Default behavior: Функции, у которых естьsize параметр, передают свои другие параметры соответствующей функции безsize параметра. [ Note: См. Примечание в предыдущемReplaceable: абзаце. ]end note

Default behavior: Еслиptr равно нулю, ничего не делает. В противном случае восстанавливает память, выделенную предыдущим вызовомoperator new.

Remarks: Это не определенно , при каких условиях части или все такого очищенного хранения будет выделяться при последующих вызовах operator new или любым из aligned_­alloc, calloc, mallocили realloc, объявленных в <cstdlib>.

void operator delete(void* ptr, const std::nothrow_t&) noexcept; void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept;

Effects: deallocation functions Называется реализацией для отображения значенияptr инвалида , когда конструктор вызывается из версии размещения nothrow из new-expressionсгенерирует исключение.

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Requires: ptr должен быть нулевым указателем или его значение должно представлять адрес блока памяти, выделенного более ранним вызовом (возможно, замененного) operator new(std​::​size_­t) или operator new(std​::​size_­t, std​::​align_­val_­t) который не был аннулирован промежуточным вызовом operator delete.

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Requires: Еслиalignment параметр отсутствует, ptr функция распределения должна вернуть его безalignment параметра. Если присутствует,alignment аргумент должен быть равенalignment аргументу, переданному возвращенной функции распределенияptr.

Default behavior: Звонкиoperator delete(ptr), илиoperator delete(ptr, alignment)соответственно.

21.6.2.2 Array forms [new.delete.array]

void* operator new[](std::size_t size); void* operator new[](std::size_t size, std::align_val_t alignment);

Effects: allocation functions Называется формой массива new-expression выделить size байты памяти. Вторая форма вызывается для типа с новым расширенным выравниванием и выделяет память с указанным выравниванием. Первая форма вызывается иначе и выделяет память, выровненную соответствующим образом, для представления любого объекта массива такого размера или меньше, при условии, что тип объекта не имеет выравнивания «новое-расширенное».218

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Required behavior: То же, что и для соответствующих однообъектных форм. Это требование является обязательным для любых заменяющих версий этих функций.

Default behavior: Возвращает operator new(size), или operator new(size, alignment)соответственно.

void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; void* operator new[](std::size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept;

Effects: То же, что и выше, за исключением того, что они вызываются версией размещения, new-expression когда программа C ++ предпочитает результат нулевого указателя в качестве индикации ошибки, а не bad_­alloc исключения.

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Required behavior: Верните ненулевой указатель на соответствующим образом выровненный storage ([basic.stc.dynamic]) или верните нулевой указатель. Каждая из этих версий nothrow operator new[] возвращает указатель, полученный, как если бы он был получен от (возможно, замененной) соответствующей функции без размещения. Это требование является обязательным для любых заменяющих версий этих функций.

Default behavior: Звонкиoperator new[](size), илиoperator new[](size, alignment)соответственно. Если вызов возвращается нормально, возвращает результат этого вызова. В противном случае возвращает нулевой указатель.

void operator delete[](void* ptr) noexcept; void operator delete[](void* ptr, std::size_t size) noexcept; void operator delete[](void* ptr, std::align_val_t alignment) noexcept; void operator delete[](void* ptr, std::size_t size, std::align_val_t alignment) noexcept;

Effects: deallocation functions Называется формой массива элементов delete-expression для отображения значенияptr недействительно.

Replaceable: Программа C ++ может определять функции с любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++. Если функция безsize параметра определена, программа также должна определить соответствующую функцию сsize параметром. Если функция сsize параметром определена, программа также должна определить соответствующую версию безsize параметра. [ Note: Приведенное ниже поведение по умолчанию может измениться в будущем, что потребует замены обеих функций освобождения при замене функции распределения. ]end note

Requires: ptr должен быть нулевым указателем или его значение должно представлять адрес блока памяти, выделенного более ранним вызовом (возможно, замененного) operator new[](std​::​size_­t) или operator new[](std​::​size_­t, std​::​align_­val_­t) который не был аннулирован промежуточным вызовом operator delete[].

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Requires: Еслиalignment параметр отсутствует, ptr функция распределения должна вернуть его безalignment параметра. Если присутствует,alignment аргумент должен быть равенalignment аргументу, переданному возвращенной функции распределенияptr. Если присутствует,size аргумент должен быть равенsize аргументу, переданному возвращенной функции распределенияptr.

Required behavior: Вызов объектаoperator delete[] сsize параметром может быть изменен на вызов соответствующего объектаoperator delete[] безsize параметра, не влияя на выделение памяти. [ Note: Соответствующая реализация предназначена для operator delete[](void* ptr, std​::​size_­t size) простого вызова operator delete[](ptr). ]end note

Default behavior: Функции, у которых естьsize параметр, передают свои другие параметры соответствующей функции безsize параметра. Функции, не имеющиеsize параметра, передают свои параметры соответствующейoperator delete (однообъектной) функции.

void operator delete[](void* ptr, const std::nothrow_t&) noexcept; void operator delete[](void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept;

Effects: deallocation functions Называется реализацией для отображения значенияptr инвалида , когда конструктор вызывается из версии размещения nothrow массива new-expressionсгенерирует исключение.

Replaceable: Программа C ++ может определять функции с помощью любой из этих сигнатур функций и тем самым заменять версии по умолчанию, определенные стандартной библиотекой C ++.

Requires: ptr должен быть нулевым указателем или его значение должно представлять адрес блока памяти, выделенного более ранним вызовом (возможно, замененного) operator new[](std​::​size_­t) или operator new[](std​::​size_­t, std​::​align_­val_­t) который не был аннулирован промежуточным вызовом operator delete[].

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Requires: Еслиalignment параметр отсутствует, ptr функция распределения должна вернуть его безalignment параметра. Если присутствует,alignment аргумент должен быть равенalignment аргументу, переданному возвращенной функции распределенияptr.

Default behavior: Звонкиoperator delete[](ptr), илиoperator delete[](ptr, alignment)соответственно.

Это не является прямой обязанностью operator new[] или operator delete[] записывать количество повторений или размер элемента массива. Эти операции выполняются в другом месте массива new и delete выражений. Однакоnew выражение массива может увеличитьsize аргумент до, operator new[] чтобы получить место для хранения дополнительной информации.

21.6.2.3 Non-allocating forms [new.delete.placement]

Эти функции зарезервированы; программа на C ++ может не определять функции, заменяющие версии в стандартной библиотеке C ++ ([constraints]). Положения[basic.stc.dynamic] не применяются к этим формам зарезервированного размещенияoperator new иoperator delete.

void* operator new(std::size_t size, void* ptr) noexcept;

Returns: ptr.

Remarks: Умышленно не выполняет никаких других действий.

[ Example: Это может быть полезно для создания объекта по известному адресу:

void* place = operator new(sizeof(Something));
Something* p = new (place) Something();

end example]

void* operator new[](std::size_t size, void* ptr) noexcept;

Returns: ptr.

Remarks: Умышленно не выполняет никаких других действий.

void operator delete(void* ptr, void*) noexcept;

Effects: Умышленно не выполняет никаких действий.

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Remarks: Функция по умолчанию new-expressionвызывается, когда любая часть инициализации в размещении, которая вызывает библиотечный оператор размещения без массива new, завершается выдачей исключения ([expr.new]).

void operator delete[](void* ptr, void*) noexcept;

Effects: Умышленно не выполняет никаких действий.

Requires: Если у реализации есть,strict pointer safety тоptr должен быть безопасный указатель.

Remarks: Функция по умолчанию new-expressionвызывается, когда любая часть инициализации в размещении, которая вызывает библиотечный оператор размещения массива new, завершается выдачей исключения ([expr.new]).

21.6.2.4 Data races [new.delete.dataraces]

Для целей определения существования рас данных, библиотек версийoperator new, замены пользователей версий глобальногоoperator new, стандартные функции библиотеки C aligned_­alloc,callocиmalloc, библиотечные версииoperator delete, замены пользователя версийoperator delete, стандартной библиотечной функции C free, и стандартный C библиотечная функцияrealloc не должна вводить гонку данных ([res.on.data.races]). Вызов этих функций, которые выделяют или освобождают конкретную единицу памяти, должны происходить в едином общем порядке, и каждый такой вызов освобождения должен выполнятьhappen before следующее выделение (если таковое имеется) в этом порядке.