170 похожих чатов

Салют! New и std::allocator совместимы? Т.е. можно их смешивать? Например, создать через allocator,

освободить через delete и наоборот создать через new, освободить через deallocate.

38 ответов

8 просмотров

Если память выравнена, то насколько я помню - нет

Eugene Krasnikov (ᴊɪɴ x)
Нет — не совместимы?

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; } нельзя

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса

Ок, а если без выравнивания? У меня есть массив. Созданный через new. Мне нужно перенести в новый массив элементы этого массива (но не все).

Вот Евгений, вот вроде серьёзный, думающий человек, а как вопрос задаст, так просто туши свет...

В стандарте определено, что std::allocator вызывает new/delete. Так что да

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Aleksander Spichak
прямо

Пример можно, как выделить через new память, не вызывая конструктор?

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Schmutziger Mund 🥋
T *allocate(size_t n) const { ...

А откуда этот код? Я же не свой аллокатор, а стандартный использую.

Благоразумие рекомендует так не делать

вы можете все вызовы new заменить на соотв методы аллокатора, по меому

Eugene Krasnikov (ᴊɪɴ x)
А откуда этот код? Я же не свой аллокатор, а станд...

Это код из прода моего, деструктор с mm free, изменил на delete вам для наглядности

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Ilya Zviagin
Нельзя, даже для int

Так показали же выше: operator new(size)

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Ilya Zviagin
operator new и new - разные вещи

В каком плане разные? Если я определяю operator new и потом вызываю new (или operator new), то моя функция и вызывается для выделения памяти.

Eugene Krasnikov (ᴊɪɴ x)
В каком плане разные? Если я определяю operator ne...

operator new только выделяет память. NEW - ещё и инициализирует объект (и НЕ ОБЯЗАТЕЛЬНО выделяет память) По идее, второе надо называть оператор new, но тогда уже мозг совсем скиснет от терминологической путаницы

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Ilya Zviagin
operator new только выделяет память. NEW - ещё и и...

Так, это понятно. У меня вопрос как раз и был о том, как через new только выделить память без инициализации объекта.

Eugene Krasnikov (ᴊɪɴ x)
Так, это понятно. У меня вопрос как раз и был о то...

new делает 2 вещи: Выделяет память - можно переопределить Вызывает конструктор по указателю на выделенную память - нельзя переопределить

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Ilya Zviagin
никак

Илья :)))) Мне не названия важны, а суть. Если new вызывает operator new, то используя последний, можно фактически выполнить new без инициализации объекта. По крайней мере, тут нет вопроса о совместимости new с malloc, std::allocator и пр. Хотя, в cppref написано, что allocate вызывает operator new.

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Aleksander Spichak
Не совместимы new и malloc

new и malloc — это понятно, а вот с allocator должна быть совместимость же...

Eugene-Krasnikov (ᴊɪɴ x) Автор вопроса
Eugene Krasnikov (ᴊɪɴ x)
new и malloc — это понятно, а вот с allocator долж...

Разве что через allocator нельзя выравнивание указать...

Ilya Zviagin
allocator по идее должен вызывать ::operator new

Да, именно так чаще всего описано во всех созданиях аналога std::allocator

Дима Жигальов
А разве не placement new?

placement new это construct у аллокатора

Aleksander Spichak
Не совместимы new и malloc

Вы столько спорили, нельзя просто сказать пишите на Си, пользуйся malloc, пишите на С++, пользуйся new?

Rearden
Вы столько спорили, нельзя просто сказать пишите н...

На плюсах пользуйся make_(unique|shared). new нужен только для placement и нестандартных выравниваний.

Похожие вопросы

Обсуждают сегодня

Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
было так ;void set_http_ver(RESPD* ptr, char* version, uint32_t length) // example: 'RTSP/1.1 ' set_http_ver: mov eax, [esp + 4] mov ecx, [esp + 8] ...
Mixail Frolov
5
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Карта сайта