Нужны ли виртуальные деструкторы в мире без динамической памяти? - PullRequest
0 голосов
/ 09 октября 2018

Виртуальные деструкторы необходимы, когда объект (потенциально) разрушается из указателя базового класса.

Рассмотрим программу без динамической памяти, которая часто встречается во встроенных системах.Здесь использование new или delete вызывает ошибку компоновщика, поскольку необходимые базовые распределители не реализованы.Таким образом, разработчики используют только статически размещенные объекты (в разделе bss / data) или автоматически размещаемые объекты (обычно в стеке).

В такой системе действительно ли существует ситуация, когда виртуальный деструктор действительно необходим?(Допустим, никто не скучает и вызывает деструктор вручную для какого-то указателя.)

Мне кажется, что статическое и автоматическое распределение всегда вызывает правильный деструктор в любом случае.Я что-то пропустил?Есть ли угловые случаи?Как насчет пулов статических объектов в сочетании с unique_ptr и пользовательским средством удаления?

1 Ответ

0 голосов
/ 09 октября 2018

Допустим, никому не скучно, и он вручную вызывает деструктор для какого-либо указателя.

Я думаю, вы слишком быстро отказались от этой возможности.Встраиваемые системы / системы с ограниченным объемом памяти, где динамическое выделение запрещено, все еще могут создавать объекты с динамическим хранением длительность .Обратите внимание:

alignas(T) char memory[sizeof(T)];
T *p = new(memory) T;  //Does not call global `new` allocator.

/*do stuff with `p`*/

p->~T();

Нет причин запрещать это.Действительно, некоторые реализации стирания типов полагаются на это при оптимизации небольших объектов.Реализации std::any для небольших объектов могут создавать производный класс полностью, используя память в самом объекте std::any.Но все равно необходимо вызвать деструктор типа, обычно через указатель базового класса.Существуют реализации any, которые не , конечно, не используют наследование, но в целом я хочу сказать, что было бы странно прямо запретить вызов деструктора вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...