Очистка в методе 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;

При взгляде на Растертекмне кажется, что ониисходят из фона C (инициализируя все переменные в верхней части функции, используя только необработанные указатели и необработанные массивы и т. д.), поэтому мне интересно, не является ли это еще одной вещью, которая не нужна в современном C ++ (с одной стороны, это усложняет задачу использовать умные указатели). Есть ли реальная выгода для этого дизайна?

Ответы на вопрос(1)

Ваш ответ на вопрос