У меня есть простая структура фиксированного размера, содержащая встроенные типы. Я создаю пул памяти, выделяя часть памяти, и разделяю эту память на блоки размером моей структуры. Затем он использует размещение new для вызова конструктора в конкретном блоке памяти для инициализации некоторых членов значениями по умолчанию. Затем я хотел бы освободить весь кусок памяти, вызвав оператор delete []. Могу ли я безопасно пропустить явный вызов деструктора для каждого объекта, инициализированного с новым размещением? Я не нахожу никаких ресурсов внутри конструктора или внутри конструкторов других полей-членов этого класса. Я просто хочу освободить весь кусок памяти.
Размещение нового и деструктора
comment
Пожалуйста, покажите свой код вместо того, чтобы объяснять его.
- person Ahmad Khan   schedule 09.08.2017
comment
Не совсем понятно, что именно вы делаете, но обычно вы можете пропустить запуск деструктора тогда и только тогда, когда объект тривиально разрушаем.
- person Baum mit Augen   schedule 09.08.2017
comment
@BaummitAugen, который в этом случае оптимизатор все равно сделает это, поэтому не стоит об этом особо думать
- person David Haim   schedule 09.08.2017
Ответы (1)
Вы можете пропустить вызов деструктора, если он тривиальный:
Вы можете определить тривиально ли разрушаемый тип, используя выражение std::is_trivially_destructible<Type>::value
. Если вы компилируете с включенной оптимизацией, большинство оптимизаторов поймут это за вас, поэтому не будет снижения производительности для написания цикла, который вызывает тривиальные деструкторы для всех объектов в блоке.
person
Sergey Kalinichenko
schedule
09.08.2017
Не только
std::is_trivially_destructible<>
можно использовать, чтобы определить, все ли в порядке. Вы ДЕЙСТВИТЕЛЬНО должны использовать его в static_assert()
, чтобы гарантировать, что кто-то не добавит string
в структуру через 6 месяцев или что-то в этом роде.
- person Frank; 09.08.2017
Что, если структура или любой ее член явно определил деструктор, но с пустым телом?
- person user7242858; 09.08.2017
@ user7242858 Любой явно предоставленный деструктор не считается тривиальным, даже если его тело пусто.
- person Sergey Kalinichenko; 09.08.2017