MPr*_*mer 5 c++ destructor c++11
我正在制作一个控制我的应用程序的全局单例,我希望子系统按特定顺序启动和关闭.
class App
{
public:
App();
~App();
void start();
void run();
void shutdown();
private:
std::unique_ptr<DisplayManager> displayManager;
std::unique_ptr<Renderer> renderer;
};
Run Code Online (Sandbox Code Playgroud)
构造函数以正确的顺序创建指针
App::App()
{
displayManager = std::unique_ptr<DisplayManager>(new DisplayManager);
renderer = std::unique_ptr<Renderer>(new Renderer);
}
Run Code Online (Sandbox Code Playgroud)
我希望以相反的顺序释放unique_ptrs.std :: unique_ptr是否保证按此顺序释放内存?
我想过让所有经理都成为全球单身人士,但如果我能让它发挥作用,我觉得这样会更好.
编辑:我注意到实际问题是实例变量成员被破坏的顺序.在那种情况下是否有保证订单?
Nat*_*ica 14
std::unique_ptr不控制何时调用析构函数.相反,它是声明它确定它被破坏的顺序的地方.
类成员按它们在类体中声明的顺序构造,并以该顺序的相反方式销毁.所以你的情况,当一个App构造displayManager构造,然后再renderer构造.当App实例被销毁,然后renderer先破坏,然后displayManager被销毁.
另请注意
App::App()
{
displayManager = std::unique_ptr<DisplayManager>(new DisplayManager);
renderer = std::unique_ptr<Renderer>(new Renderer);
}
Run Code Online (Sandbox Code Playgroud)
你正在分配默认构造的unique_ptrs.您需要使用成员初始化列表
App::App(): displayManager(new DisplayManager), renderer(new Renderer) {}
// or if you want to be in the don't use new camp
App::App(): displayManager(std::make_unique<DisplayManager>()), renderer(std::make_unique<Renderer>()) {}
Run Code Online (Sandbox Code Playgroud)
如果您不想默认构造指针然后分配给它们.