<new>
операторы и перечисления
enum align_val_t
enum class align_val_t : size_t {};
operator delete
Функция, вызываемая выражением delete
для освобождения хранилища для отдельных объектов.
void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
Параметры
ptr
Указатель, значение которого при удалении устанавливается в недействительное.
Замечания
Первая функция вызывается выражением delete
для отрисовки недопустимого ptr
значения. Программа может определить функцию с помощью сигнатуры этой функции, которая заменяет версию по умолчанию из стандартной библиотеки C++. Необходимое поведение заключается в том, чтобы принять значение ptr
этого nullptr
или возвращаемого более ранним вызовом operator new
.
Поведение по умолчанию для nullptr
значения ptr
не выполняется. Любое другое значение должно быть значением ptr
, возвращаемым ранее вызовом new
, как описано ранее. Поведение по умолчанию для значения ptr
, отличного от NULL, заключается в том, чтобы освободить хранилище, выделенное предыдущим вызовом. Оно не указано, в каких условиях часть или все такое повторное хранилище выделяется последующим вызовом operator new
или любой из calloc
функций или malloc
realloc
функций.
Вторая функция вызывается выражением размещения delete
, соответствующим new
выражению формы new( std::size_t )
. Она ничего не делает.
Третья функция вызывается выражением размещения delete
, соответствующим new
выражению формы new( std::size_t, const std::nothrow_t& )
. Программа может определить функцию с помощью сигнатуры этой функции, которая заменяет версию по умолчанию из стандартной библиотеки C++. Необходимое поведение заключается в принятии значения ptr
этого nullptr
или возвращаемого более ранним вызовом operator new
. Поведение по умолчанию — оценка delete( ptr )
.
Пример
Пример operator new
использования operator delete
.
operator delete[]
Функция, вызываемая выражением delete
для освобождения хранилища для массива объектов.
void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
Параметры
ptr
Указатель, значение которого при удалении устанавливается в недействительное.
Замечания
Первая функция вызывается выражением delete[]
и устанавливает значение ptr
в недействительное. Это заменяемая функция, так как в программе можно определить функцию с сигнатурой этой функции, которая заменит версию по умолчанию из стандартной библиотеки C++. Необходимое поведение заключается в принятии значения ptr
этого nullptr
или возвращаемого более ранним вызовом operator new[]
. По умолчанию при значении null для ptr
функция не должна выполнять никаких действий. Любое другое значение ptr
должно быть значением, возвращенным ранее в результате вызова, как описано выше. Поведение по умолчанию для такого значения ptr
, отличного от NULL, заключается в том, чтобы освободить хранилище, выделенное предыдущим вызовом. Оно не указано, в каких условиях часть или все такое повторное хранилище выделяется последующим вызовом operator new
или любой из calloc
функций или malloc
realloc
функций.
Вторая функция вызывается выражением размещения delete[]
, соответствующим new[]
выражению формы new[]( std::size_t )
. Она ничего не делает.
Третья функция вызывается выражением размещения delete[]
, соответствующим new[]
выражению формы new[]( std::size_t, const std::nothrow_t& )
. Программа может определить функцию с помощью сигнатуры этой функции, которая заменяет версию по умолчанию из стандартной библиотеки C++. Необходимое поведение заключается в принятии значения ptr
этого nullptr
или возвращаемого более ранним вызовом оператора new[]
. Поведение по умолчанию — оценка delete[]( ptr )
.
Пример
Примеры operator new[]
использования operator delete[]
.
operator new
Функция вызывается выражением new для выделения памяти для отдельных объектов.
void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;
Параметры
count
Количество байт памяти для выделения.
ptr
Возвращаемый указатель.
Возвращаемое значение
Указатель на самый низкий байтовый адрес только что выделенного хранилища. Или ptr
, если используется третья форма функции.
Замечания
Первая функция вызывается выражением new
для выделения count
байтов хранилища, подходящего для представления любого объекта этого размера. Эта функция может быть заменена. Это означает, что программа может определить альтернативную функцию с этой подписью функции, которая заменяет версию по умолчанию, определенную стандартной библиотекой C++.
Необходимое поведение заключается в возврате указателя, отличного от NULL, только если хранилище можно выделить как запрошенное. Каждое такое выделение выдает указатель на память, которая не пересекается ни с одной другой выделенной памятью. Порядок и непрерывность памяти, выделяемой последовательными вызовами, не уточняется. Начальное сохраненное значение не уточняется. Возвращаемый указатель указывает на начало (самый низкий байтовый адрес) выделенного хранилища. Если count
значение равно нулю, возвращаемое значение не сравнивается с любым другим значением, возвращаемым функцией.
Поведение по умолчанию — выполнить цикл. Внутри цикла функция сначала пытается выделить запрошенную память. Указывает, не указана ли попытка вызова malloc
. Если попытка выделения выполнена успешно, функция возвращает указатель на выделенное хранилище. В противном случае функция вызывает назначенную функцию типа new_handler
. Если вызванная функция возвращает управление, цикл повторяется. Цикл завершается, когда попытка выделить запрошенное хранилище успешно или когда вызываемая функция не возвращается.
Необходимое поведение функции типа new_handler
заключается в выполнении одной из следующих операций:
Сделать больше памяти, доступной для выделения, и завершить выполнение.
Вызов либо
abort
exit
.Создание объекта типа
bad_alloc
.
Поведение new_handler
функции по умолчанию — создание объекта типа bad_alloc
. Значение nullptr
обозначает функцию по умолчанию new_handler
.
Порядок и связь хранилища, выделенные последовательными вызовами operator new
, не определены, как и исходные значения, хранящиеся там.
Чтобы освободить хранилище, выделенное operator new
первой формой вызова operator delete
.
Вторая функция вызывается выражением размещения new
для выделения count
байтов хранилища, подходящего для представления любого объекта этого размера. Эта функция может быть заменена. Это означает, что программа может определить альтернативную функцию с этой подписью функции, которая заменяет версию по умолчанию, определенную стандартной библиотекой C++.
Поведение по умолчанию — возвращать operator new( count )
, если эта функция выполнена успешно. В противном случае возвращается значение nullptr
.
Чтобы освободить хранилище, выделенное второй формой operator new
(т. е. если он не вернулся nullptr
), вызов operator delete
.
Третья функция вызывается неозначительным выражением размещения new
формы new ( ptr ) T
. Здесь состоит ptr
из одного указателя объекта. Это может быть полезно для создания объекта по известному адресу. Функция возвращает ptr
. Необходимо явно вызвать деструктор для этого объекта.
Если вы вызываете неоценкующее размещение new
, не вызывайте delete
. Вместо этого вызовите деструктор сделки для предоставленной памяти при необходимости после вызова деструктора для объекта.
Сведения о том, как создавать или не бросать, new
см. в разделе "Операторы" и delete
"Операторыnew
".
Пример
// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main( )
{
// The first form of new / delete
MyClass* fPtr1 = new MyClass;
delete fPtr1;
// The second form (fail returns nullptr) of new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete fPtr2;
// The third form (non-allocating placement) of new / delete
char x[sizeof(MyClass)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass;
fPtr3->~MyClass(); // Requires explicit destructor call
// no delete because x is on the stack
}
operator new[]
Функция выделения, вызываемая выражением new для выделения памяти для массива объектов.
void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;
Параметры
count
Число байт памяти, которые нужно выделить для объекта-массива.
ptr
Возвращаемый указатель.
Возвращаемое значение
Указатель на самый низкий байтовый адрес только что выделенного хранилища. Или ptr
, когда используется третья форма.
Замечания
Первая функция вызывается выражением new[]
для выделения count
байт памяти, подходящим образом выровненной для представления любого объекта-массива такого или меньшего размера. Программа может определить функцию с помощью сигнатуры этой функции, которая заменяет версию по умолчанию из стандартной библиотеки C++. Требуемое поведение совпадает с operator new
поведением. Поведение по умолчанию — возвращать operator new( count )
, если он успешно выполнен. В противном случае создается std::bad_alloc
исключение (или исключение, производное от std::bad_alloc
). Чтобы освободить хранилище, выделенное этой формой operator new[]
вызова operator delete[]
.
Вторая функция вызывается выражением new[]
для выделения count
байт памяти, подходящим образом выровненной для представления любого объекта-массива такого размера. Программа может определить функцию с помощью сигнатуры этой функции, которая заменяет версию по умолчанию из стандартной библиотеки C++. Поведение по умолчанию — возвращать operator new( count )
, если эта функция выполнена успешно. В противном случае возвращается значение nullptr
. Чтобы освободить хранилище, выделенное этой формой operator new[]
вызова operator delete[]
. Дополнительные сведения о поведении new
вызовов или неисключаемых действий см. в разделе "Операторы" и delete
"Операторыnew
".
Третья функция вызывается неозначительным выражением размещения new[]
формы new( ptr ) T[ N ]
. Эта форма не выделяет память. Он создает объекты в памяти, переданной ptr
через параметр. Функция возвращает ptr
. Необходимо явно вызвать деструктор для каждого созданного объекта. Вы несете ответственность за предоставление достаточного объема памяти.ptr
Не вызывайте delete[]
значение, возвращаемое выражением new
. Вместо этого при необходимости разместите ptr
сделку после вызова деструкторов.
Пример
// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main() {
// The first form of array new / delete
MyClass* fPtr1 = new MyClass[2];
delete[] fPtr1;
// The second form (fail returns nullptr) of array new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete[] fPtr2;
// The third form (non-allocating placement) of array new / delete
char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass[2];
fPtr3[1].~MyClass(); // Requires explicit destructor calls
fPtr3[0].~MyClass(); // Recommended in reverse construction order
// Don't delete[] fPtr3 here.
// delete[] &x[0] not required because x is on the stack
}