Размещение нового и деструктора

У меня есть простая структура фиксированного размера, содержащая встроенные типы. Я создаю пул памяти, выделяя часть памяти, и разделяю эту память на блоки размером моей структуры. Затем он использует размещение new для вызова конструктора в конкретном блоке памяти для инициализации некоторых членов значениями по умолчанию. Затем я хотел бы освободить весь кусок памяти, вызвав оператор delete []. Могу ли я безопасно пропустить явный вызов деструктора для каждого объекта, инициализированного с новым размещением? Я не нахожу никаких ресурсов внутри конструктора или внутри конструкторов других полей-членов этого класса. Я просто хочу освободить весь кусок памяти.


person user7242858    schedule 09.08.2017    source источник
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
comment
Не только std::is_trivially_destructible<> можно использовать, чтобы определить, все ли в порядке. Вы ДЕЙСТВИТЕЛЬНО должны использовать его в static_assert(), чтобы гарантировать, что кто-то не добавит string в структуру через 6 месяцев или что-то в этом роде. - person Frank; 09.08.2017
comment
Что, если структура или любой ее член явно определил деструктор, но с пустым телом? - person user7242858; 09.08.2017
comment
@ user7242858 Любой явно предоставленный деструктор не считается тривиальным, даже если его тело пусто. - person Sergey Kalinichenko; 09.08.2017