Возможно ли с помощью оператора new сделать что-то вроде этого:
class MyData {
char data[1024];
MyData() {}
};
MyData* dataArray = static_cast
Т.е. выделить память под объект или массив объектов без ее инициализации?
Ответ
Конечно. Можно использовать тот же 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];
Конечно же, при таком подходе вызов конструкторов и деструкторов целиком на авторе кода.
Комментариев нет:
Отправить комментарий