Очистка в методе Shutdown () вместо деструктора
ВУчебные пособия по Rastertek DirectX они имеют пустые конструкторы и деструкторы и вместо этого используютinitialize()
а такжеshutdown()
функции для инициализации и очистки объектов. После использования этого дизайна в течение некоторого времени я могу понять преимущества наличияinitialize()
метод, но я не вижу, как с помощьюshutdown()
метод лучше, чем поместить весь код очистки в деструктор.
Причина, которую они предоставляют, заключается в следующем:
Вы также заметите, что я не делаю никакой очистки объекта в деструкторе класса. Вместо этого я выполняю очистку всего объекта в функции выключения, которую вы увидите ниже. Причина в том, что я не доверяю тому, чтобы меня называли. Некоторые функции Windows, такие как ExitThread (), известны тем, что не вызывают деструкторы вашего класса, что приводит к утечкам памяти. Конечно, теперь вы можете вызывать более безопасные версии этих функций, но я просто осторожен при программировании на Windows.
Таким образом, общая схема использования выглядит следующим образом:
class Renderer
{
public:
Renderer() { }
~Renderer() { }
bool initialize(...) { /* perform initialization */ }
void shutdown() { /* clean-up */ }
};
Renderer* renderer = new Renderer;
renderer->initialize(...);
// use the renderer
renderer->shutdown();
delete renderer;
renderer = NULL;
Глядя на код Rastertek, мне кажется, что они исходят из C-фона (инициализация всех переменных в верхней части функции, использование только необработанных указателей и необработанных массивов и т. Д.), Поэтому мне интересно, не является ли это еще одной вещью, которая ненужный в современном C ++ (например, это затрудняет использование умных указателей). Есть ли реальная выгода для этого дизайна?