是否保证std :: unique_ptr删除顺序?

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)

如果您不想默认构造指针然后分配给它们.


Lig*_*ica 9

是的,销毁订单是有保证的.

每个缺失者将被尽快亏欠的调用std::unique_ptr被破坏裁判,和std::unique_ptrs的在其结构相反的顺序破坏时,他们都走出去的范围一起参考.

但是,此订单与您内部的分配顺序没有直接关系App::App()- 您可以将它们交换掉并且不会发生任何变化.这是std::unique_ptrs内部声明的顺序App.

因此,虽然销毁订单是有保证的,但可能不是您期望的订单.