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

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

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

38 ответов

24 просмотра

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

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 и нестандартных выравниваний.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта