我正在制作一个控制我的应用程序的全局单例,我希望子系统按特定顺序启动和关闭。
class App
{
public:
App();
~App();
void start();
void run();
void shutdown();
private:
std::unique_ptr<DisplayManager> displayManager;
std::unique_ptr<Renderer> renderer;
};
构造函数按正确顺序创建指针。
App::App()
{
displayManager = std::unique_ptr<DisplayManager>(new DisplayManager);
renderer = std::unique_ptr<Renderer>(new Renderer);
}
我希望unique_ptrs按相反的顺序被释放。 std::unique_ptr是否保证以此顺序释放内存?
我考虑过将所有管理器作为全局单例,但如果我可以使其工作,我认为这种方式会更好。
编辑:已经有人指出实际问题是实例变量成员的销毁顺序。在这种情况下,是否有担保的顺序?
unique_ptr
的任何“保证”无关,而是涉及数据成员析构函数调用的顺序。 - juanchopanzarenderer
将首先执行,然后是displayManager
。无论你如何在初始化列表中(没有初始化列表,所以默认构造函数优先)或稍后在构造函数体中更改它们的顺序,你的智能指针都将按照成员声明顺序进行构造。销毁也将是同样可预测的相反顺序。 - WhozCraigunique_ptr
上的reset()
来实现。即使当前的销毁顺序对您有效,这也可能不是一个坏主意。 - Benjamin Lindley