Предположим, у нас есть класс с умным указателем. Этот класс инициализирует подсистему, на которую опирается интеллектуальный указатель: аналогично, этот класс закрывает подсистему при уничтожении.
Если интеллектуальный указатель полагается на указанную подсистему для освобождения своей памяти, то, если деструктор сначала закрывает подсистему, возникает проблема.
class FontManager {
public:
FontManager() {
if(TTF_Init() < 0) {
printf( "SDL_ttf could not init! SDL_ttf Error: %s\n", TTF_GetError() );
return;
}
}
~FontManager() {
TTF_Quit();
}
std::unique_ptr<TTF_Font> font;
void operator()(TTF_Font* font) const { TTF_CloseFont(font); }
};
Если бы я использовал необработанные указатели, деструктор выглядел бы так:
~FontManager() {
// font is raw pointer
TTF_CloseFont(font);
TTF_Quit();
}
Итак, что вызывается первым: деструктор указателя или деструктор класса?