优先顺序:智能指针和类析构函数

时间:2018-11-02 07:15:33

标签: c++ stl sdl

假设我们有一个带有智能指针的类。此类初始化智能指针所依赖的子系统:类似地,此类在销毁后关闭子系统。

如果智能指针依靠所述子系统释放其内存,那么如果析构函数首先关闭子系统,则会出现问题。

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();
}

那么,首先调用的是指针的析构函数还是类的析构函数?

1 个答案:

答案 0 :(得分:3)

就像子对象是在类的构造函数的开始处构造的(在成员初始值设定项列表中,可能是隐式的)一样,它们是析构函数的destroyed at the end(与其相反的顺序)像往常一样)。

您当然可以在析构函数中reset 手动使用指针;它们仍将在最后被销毁,但没有效果。但是real answer是将子系统(初始化)封装为它的自己的资源,然后将该新类的实例添加为更早的成员,然后让包含类使用隐式析构函数。这样做还有一个额外的好处,那就是当您使用子系统分配智能指针的对象时,可以确保该子系统已被初始化