优先顺序:智能指针和类析构函数
Order of Precedence: Smart Pointer and Class Destructor
假设我们有一个带有智能指针的类。这个类初始化智能指针所依赖的子系统:类似地,这个类在销毁时关闭子系统。
如果智能指针依赖于所述子系统来释放其内存,那么如果析构函数首先关闭子系统,就会出现问题。
class FontManager {
public:
FontManager() {
if(TTF_Init() < 0) {
printf( "SDL_ttf could not init! SDL_ttf Error: %sn", 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();
}
那么,首先调用的是指针的析构函数还是类的析构因子呢?
正如子对象是在类构造函数的开始处构造的(在成员初始值设定项列表中,可能是隐式的(,它们在析构函数的结束处被销毁(与通常相反的构造顺序(。
当然,您可以在析构函数中手动reset
您的指针;它们在战争结束时仍将被摧毁,但没有任何效果。但真正的答案是将子系统(初始化(封装为其自己的资源,将该新类的实例添加为早期成员,然后让包含类使用隐式析构函数。这还有一个额外的好处,即当您使用子系统来分配智能指针的对象时,可以保证子系统被初始化。
相关文章:
- 优先顺序:智能指针和类析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何将析构函数分配给指针
- 智能指针析构函数争用条件
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 在C++中删除指针数组时析构函数崩溃
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除析构函数C++中的指针
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 在析构函数内取消引用指针时出现分段错误
- 共享指针析构函数中的内存顺序
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 删除对象而不调用成员指针的析构函数
- 析构函数在与 STL 的共享指针中调用两次