освободить через delete и наоборот создать через new, освободить через deallocate.
Если память выравнена, то насколько я помню - нет
Нет — не совместимы?
T *allocate(size_t n) const { if (!n) return nullptr; auto res = static_cast<T *>(_mm_malloc(sizeof(T) * n, Alignment)); if (!res) throw std::bad_alloc(); return res; } Где Alignment это выравнивание (size_t) в таком случаее писать void deallocate(T *p, size_t) const { delete p; } нельзя
Ок, а если без выравнивания? У меня есть массив. Созданный через new. Мне нужно перенести в новый массив элементы этого массива (но не все).
Вот Евгений, вот вроде серьёзный, думающий человек, а как вопрос задаст, так просто туши свет...
В стандарте определено, что std::allocator вызывает new/delete. Так что да
Ну так, пролей свет толковым ответом :)
Хм, а как allocate вызывает new, интересно?
Пример можно, как выделить через new память, не вызывая конструктор?
А откуда этот код? Я же не свой аллокатор, а стандартный использую.
T* dest = reinterpret_cast<T*>(new int8_t[n * sizeof(T)])
Благоразумие рекомендует так не делать
вы можете все вызовы new заменить на соотв методы аллокатора, по меому
Это код из прода моего, деструктор с mm free, изменил на delete вам для наглядности
Нельзя, даже для int
Так показали же выше: operator new(size)
operator new и new - разные вещи
В каком плане разные? Если я определяю operator new и потом вызываю new (или operator new), то моя функция и вызывается для выделения памяти.
operator new только выделяет память. NEW - ещё и инициализирует объект (и НЕ ОБЯЗАТЕЛЬНО выделяет память) По идее, второе надо называть оператор new, но тогда уже мозг совсем скиснет от терминологической путаницы
Так, это понятно. У меня вопрос как раз и был о том, как через new только выделить память без инициализации объекта.
new делает 2 вещи: Выделяет память - можно переопределить Вызывает конструктор по указателю на выделенную память - нельзя переопределить
Илья :)))) Мне не названия важны, а суть. Если new вызывает operator new, то используя последний, можно фактически выполнить new без инициализации объекта. По крайней мере, тут нет вопроса о совместимости new с malloc, std::allocator и пр. Хотя, в cppref написано, что allocate вызывает operator new.
Не совместимы new и malloc
new и malloc — это понятно, а вот с allocator должна быть совместимость же...
allocator по идее должен вызывать ::operator new
Разве что через allocator нельзя выравнивание указать...
Да, именно так чаще всего описано во всех созданиях аналога std::allocator
А разве не placement new?
зависит от метода
placement new это construct у аллокатора
Вы столько спорили, нельзя просто сказать пишите на Си, пользуйся malloc, пишите на С++, пользуйся new?
На плюсах пользуйся make_(unique|shared). new нужен только для placement и нестандартных выравниваний.
Обсуждают сегодня