Поделиться через


<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функций или mallocrealloc функций.

Вторая функция вызывается выражением размещения 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функций или mallocrealloc функций.

Вторая функция вызывается выражением размещения 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
}