|
0 / 0 / 0
Регистрация: 21.08.2024
Сообщений: 24
|
|||||||||||
Динамическое выделение памяти new/delete26.08.2024, 23:49. Показов 2640. Ответов 28
Всем здравствуйте. Читаю книгу Стивена Прата и наткнулся на такую ситуацию:
В книге описан подобный приведенному ниже пример (в нём использую свой связный список):
Объясните, пожалуйста, что и где я написал не так или понял не так. Добавлено через 15 минут Забыл добавить, что для pl2 при выделении места в buf в книге добавляется N-ное количество байт (sizeof(List)) относительно размещения pl1. т.е. по книжному код выглядит так:
0
|
|||||||||||
| 26.08.2024, 23:49 | |
|
Ответы с готовыми решениями:
28
почему не delete (выделение памяти) Распределение памяти. Динамическое выделение памяти |
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 27.08.2024, 16:37 | |
|
Встречал в embeded, когда объект надо расположить строго по определённому адресу (на память не вспомню, но есть синтаксис, позволяющий указать адрес куда сделать new).
Обычно такой "объект" по сути представляет из себя "именованные" конкретные адреса в памяти, связанные с какой-то аппаратурой, плюс удобные методы-обертки.
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||
| 27.08.2024, 16:46 | |||||||
Вот тебе даже пример накатал (далее дам более практическую теорию):
В реальности это может быть использовано например при высоких сетевых нагрузках на сервер. На каждый запрос тебе нужно выделять память, что бы хранить данные клиента. И еще когда используется placement new, нужно помнить об alignment requirements. Если ты вдруг разместишь объект по адресу, по которому он не имеет право существовать, то получишь UB или потерю производительности из-за обращения к данным по невыровненному адресу.
0
|
|||||||
|
Нарушитель
6325 / 3053 / 1054
Регистрация: 01.06.2021
Сообщений: 11,671
|
|
| 27.08.2024, 17:01 | |
|
Undisputed, ещё давно разрабы gcc обсуждали про атаку переполнением буфера для placement new: https://gcc.gnu.org/legacy-ml/... 02001.html
Им даже пришлось выпустить патч. Вот и я подумал, не из-за того, что placement new это источник уязвимостей в коде, его многие избегают? Конечно, теоретические примеры, в котором placement new имеет преимущества, это одно. Но на практике совсем другое. Вот, KSergey9 заговорил об embedded и тут есть логика в оправданности его применения. С кастомными аллокаторами тоже есть кое-какая логика. Но все равно, я не вижу, чтобы его массово применяли.
0
|
|
|
Вездепух
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
|
||
| 27.08.2024, 17:08 | ||
|
Всякий раз, например, когда вам нужно разделить выделение памяти и конструирование объектов, понадобится placement new. Возьмите, например, std::vector, в котором есть такое разделение, т.е. есть capacity и есть size - количество выделенной "сырой" памяти и количество уже сконструированных объектов. Понятно, что std::vector будет вынужден отдельно выделять память и отдельно конструировать в ней объекты. Последнее делается через placement new.
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 27.08.2024, 17:09 | |||
|
Даже многие стандартные контейнеры в С++ умеют выделять память для своих элементов через кастомный аллокатор. Это как бы намекает, что именно placement new они и используют для размещения объектов в памяти, которую получают через шаблонный параметр для аллокатора. Добавлено через 32 секунды
0
|
|||
|
Вездепух
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
|
||
| 27.08.2024, 17:10 | ||
std::construct_at, либо более толстая, вроде std::optional или std::variant.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 27.08.2024, 17:40 | ||||||
|
Выше в моем сообщении #22 есть ошибка, хотя она может и не проявлять себя. Буфер должен быть выровнен должным образом, что бы туда можно было положить объект типа
Test через placement new.Сделать это можно создав буфер так:
std::aligned_storage
0
|
||||||
|
Вездепух
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
|
||||||||||||
| 28.08.2024, 02:25 | ||||||||||||
|
1. В зависимости от условия нам нужен один объект либо типа A, либо типа B (типы могут быть полиморфными наследниками одной базы, а могут быть не связаны вообще). 2. Нам нужен объект типа A, но в зависимости от условия конструировать его нужно одним или другим конструктором. 3. Нам как бы нужен объект типа A, но в зависимости от условия он может быть не нужен вообще Как поступать в таких ситуациях? В книжках для начинающих в таких случаях обычно советуют создавать объекты динамически при помощи new. Например, для решения проблемы номер 3 предлагается делать что-то такое
std::optional: Вызов нужного конструктора (пример по ссылке и для проблемы 2)
2
|
||||||||||||
|
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,311
|
||||||
| 28.08.2024, 02:40 | ||||||
0
|
||||||
| 28.08.2024, 02:40 | |
|
Динамическое выделение памяти Динамическое выделение памяти new Динамическое выделение памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|