gpt4 book ai didi

c++ - 优先顺序 : Smart Pointer and Class Destructor

转载 作者:太空狗 更新时间:2023-10-29 21:10:45 28 4
gpt4 key购买 nike

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

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

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

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

最佳答案

正如子对象是在类的构造函数的开头构造的(在成员初始化列表中,可能是隐式的),它们是destroyed at the end析构函数(像往常一样以相反的构造顺序)。

您当然可以在析构函数中重置您的指针手动;他们仍然会在结束时被摧毁,但没有任何效果。但是 real answer是将子系统(初始化)封装为它的自己的资源,添加那个新类的实例作为earlier成员,然后让包含的类使用隐式析构函数。这样做的额外好处是,当您使用子系统分配智能指针的对象时,可以保证子系统被初始化

关于c++ - 优先顺序 : Smart Pointer and Class Destructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com