Страницы

Поиск по вопросам

понедельник, 10 июня 2019 г.

Выделение памяти без инициализации с помощью оператора new

Возможно ли с помощью оператора new сделать что-то вроде этого:
class MyData { char data[1024]; MyData() {} };
MyData* dataArray = static_cast(malloc(10 * sizeof(MyData)));
Т.е. выделить память под объект или массив объектов без ее инициализации?


Ответ

Конечно. Можно использовать тот же malloc, а можно использовать operator new (или operator new[]), который выделит кусок "сырой" памяти. Отличие operator new от operator new[] - фактически в том, что можно более эффективнее реализовать собственные версии этих операторов. Так что всё, что сказано про operator new, относится и к operator new[]
operator new также запрашивает непрерывный кусок памяти, и возвращает указатель на "нечто" (void*). Никакие конструкторы эта штуковина тоже не вызывает, но уже знает о исключениях и если выделение не удастся, то, кинет исключение, а не вернет nullptr (хотя это не всегда выполняется). На самом деле, сначала еще попытает счастье с new_handler, но опустим этот момент. Также есть версия, которая не кидает исключение, а возвращает nullptr в случае неудачи и версия, которая совсем не выделяет память, а просто параметр-указатель проходит там "транзитом" (такая версия используется для placement new), причем можно еще и перегружать operator new, но сейчас не об этом.
Для освобождения памяти, выделенной с помощью operator new, используется operator delete
Для освобождения памяти, выделенной с помощью operator new[], используется operator delete[]
void *p = operator new(sizeof(T) * count); operator delete (p);
Вызвать конструкторы для инициализации можно с помощью placement new
T *pT = new (p) T[count];
Конечно же, при таком подходе вызов конструкторов и деструкторов целиком на авторе кода.

Комментариев нет:

Отправить комментарий