Заголовок <new> определяет несколько функций, которые управляют распределением динамической памяти в программе. Он также определяет компоненты для сообщения об ошибках управления хранилищем.
namespace std { class bad_alloc; class bad_array_new_length; enum class align_val_t : size_t {}; struct nothrow_t { explicit nothrow_t() = default; }; extern const nothrow_t nothrow; using new_handler = void (*)(); new_handler get_new_handler() noexcept; new_handler set_new_handler(new_handler new_p) noexcept; // [ptr.launder], pointer optimization barrier template <class T> constexpr T* launder(T* p) noexcept; // [hardware.interference], hardware interference size inline constexpr size_t hardware_destructive_interference_size = implementation-defined; inline constexpr size_t hardware_constructive_interference_size = implementation-defined; } void* operator new(std::size_t size); void* operator new(std::size_t size, std::align_val_t 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; 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; 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; void* operator new[](std::size_t size); void* operator new[](std::size_t size, std::align_val_t 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; 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; 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; void* operator new (std::size_t size, void* ptr) noexcept; void* operator new[](std::size_t size, void* ptr) noexcept; void operator delete (void* ptr, void*) noexcept; void operator delete[](void* ptr, void*) noexcept;
Смотрите также: [intro.memory], [basic.stc.dynamic], [expr.new], [expr.delete], [class.free], [memory].
Если не указано иное, положения [basic.stc.dynamic] применяются к библиотечным версиям operator new и operator delete. Если значение аргумента выравнивания, переданное любой из этих функций, не является допустимым значением выравнивания, поведение не определено.
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 не определена.
Возвращает указатель на выделенное хранилище, если попытка успешна. В противном случае, если current new_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.
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.
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: То же, что и для соответствующих однообъектных форм. Это требование является обязательным для любых заменяющих версий этих функций.
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[] чтобы получить место для хранения дополнительной информации.
Эти функции зарезервированы; программа на C ++ может не определять функции, заменяющие версии в стандартной библиотеке C ++ ([constraints]). Положения [basic.stc.dynamic] не применяются к этим формам зарезервированного размещения operator new и operator delete.
void* operator new(std::size_t size, void* ptr) noexcept;
[ Example: Это может быть полезно для создания объекта по известному адресу:
void* place = operator new(sizeof(Something)); Something* p = new (place) Something();
— end example ]
void* operator new[](std::size_t size, void* ptr) noexcept;
void operator delete(void* ptr, void*) noexcept;
Requires: Если у реализации есть, strict pointer safety то ptr должен быть безопасный указатель.
Remarks: Функция по умолчанию new-expressionвызывается, когда любая часть инициализации в размещении, которая вызывает библиотечный оператор размещения без массива new, завершается выдачей исключения ([expr.new]).
void operator delete[](void* ptr, void*) noexcept;
Requires: Если у реализации есть, strict pointer safety то ptr должен быть безопасный указатель.
Remarks: Функция по умолчанию new-expressionвызывается, когда любая часть инициализации в размещении, которая вызывает библиотечный оператор размещения массива new, завершается выдачей исключения ([expr.new]).
Для целей определения существования рас данных, библиотек версий operator new, замены пользователей версий глобального operator new, стандартные функции библиотеки C aligned_alloc, callocи malloc, библиотечные версии operator delete, замены пользователя версий operator delete, стандартной библиотечной функции C free, и стандартный C библиотечная функция realloc не должна вводить гонку данных ([res.on.data.races]). Вызов этих функций, которые выделяют или освобождают конкретную единицу памяти, должны происходить в едином общем порядке, и каждый такой вызов освобождения должен выполнять happen before следующее выделение (если таковое имеется) в этом порядке.
namespace std { class bad_alloc : public exception { public: bad_alloc() noexcept; bad_alloc(const bad_alloc&) noexcept; bad_alloc& operator=(const bad_alloc&) noexcept; const char* what() const noexcept override; }; }
Класс bad_alloc определяет тип объектов, создаваемых реализацией как исключения, чтобы сообщить об ошибке выделения памяти.
bad_alloc() noexcept;
bad_alloc(const bad_alloc&) noexcept;
bad_alloc& operator=(const bad_alloc&) noexcept;
const char* what() const noexcept override;
Remarks: Сообщение может быть null-terminated multibyte string, подходящим для преобразования и отображенным как wstring ([string.classes], [locale.codecvt]).
namespace std { class bad_array_new_length : public bad_alloc { public: bad_array_new_length() noexcept; const char* what() const noexcept override; }; }
Класс bad_array_new_length определяет тип объектов, создаваемых реализацией как исключения, чтобы сообщить о попытке выделить массив размером меньше нуля или больше определенного реализацией limit ([expr.new]).
bad_array_new_length() noexcept;
const char* what() const noexcept override;
Remarks: Сообщение может быть null-terminated multibyte string, подходящим для преобразования и отображенным как wstring ([string.classes], [locale.codecvt]).
using new_handler = void (*)();
Тип a, handler function который будет вызываться operator new() or operator new[]() ([new.delete]), когда они не могут удовлетворить запрос на дополнительное хранилище.
Required behavior: A new_handler должен выполнить одно из следующих действий:
new_handler set_new_handler(new_handler new_p) noexcept;
new_handler get_new_handler() noexcept;
template <class T> constexpr T* launder(T* p) noexcept;
Remarks: Вызов этой функции может использоваться в выражении основной константы всякий раз, когда значение ее аргумента может использоваться в выражении основной константы. Байт хранилища доступен через значение указателя, которое указывает на объект, Y если он находится в памяти, занятой Y, объект, который является взаимопреобразуемым по указателю Y, или объект массива, непосредственно включающий его, если он Y является элементом массива. Программа неправильно сформирована, если T это функция типа или cv void.
[ Note: Если новый объект создается в хранилище, занимаемом существующим объектом того же типа, указатель на исходный объект может использоваться для ссылки на новый объект, если тип не содержит const или не ссылается на члены; в последних случаях эту функцию можно использовать для получения полезного указателя на новый объект. Смотрите [basic.life]. ] — end note
[ Example:
struct X { const int n; }; X *p = new X{3}; const int a = p->n; new (p) X{5}; // p does not point to new object ([basic.life]) because X::n is const const int b = p->n; // undefined behavior const int c = std::launder(p)->n; // OK
— end example ]
inline constexpr size_t hardware_destructive_interference_size = implementation-defined;
Это число является минимальным рекомендуемым смещением между двумя объектами, к которым осуществляется одновременный доступ, чтобы избежать дополнительного снижения производительности из-за конкуренции, вызванной реализацией. Должно быть как минимум alignof(max_align_t).
struct keep_apart { alignas(hardware_destructive_interference_size) atomic<int> cat; alignas(hardware_destructive_interference_size) atomic<int> dog; };
— end example ]
inline constexpr size_t hardware_constructive_interference_size = implementation-defined;
Это число представляет собой максимальный рекомендуемый размер непрерывной памяти, занятой двумя объектами, доступ к которым осуществляется с временной локальностью для одновременных потоков. Должно быть как минимум alignof(max_align_t).
struct together { atomic<int> dog; int puppy; }; struct kennel { // Other data members... alignas(sizeof(together)) together pack; // Other data members... }; static_assert(sizeof(together) <= hardware_constructive_interference_size);
— end example ]