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

干酸盐

我正在制作一个用于控制我的应用程序的全局单例,并且希望子系统按特定顺序启动和关闭。

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是否可以保证按此顺序释放内存?

我曾考虑过让所有经理人成为全球单身人士,但我认为,如果我能使其运作起来,那就更好。

编辑:引起我注意,实际问题是实例变量成员被破坏的顺序。在那种情况下,有保证的订单吗?

内森·奥利弗

std::unique_ptr不控制何时调用析构函数。而是在声明位置确定销毁顺序。

类成员按照它们在类主体中声明的顺序构造,并以该顺序的相反顺序销毁。因此,在您的情况下,App构造adisplayManager然后再renderer构造a。App实例被销毁时,先renderer销毁然后displayManager销毁。


另请注意

App::App()
{
    displayManager = std::unique_ptr<DisplayManager>(new DisplayManager);
    renderer = std::unique_ptr<Renderer>(new Renderer);
}

您正在分配给默认构造unique_ptr的。您需要使用成员初始化列表,例如

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

如果您不想默认构造指针,然后将其分配给它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以保证unique_ptr在移动后存储nullptr?

std :: unique_ptr析构函数构造函数顺序

std :: unique_ptr尝试引用已删除的函数

奇怪的错误:当未真正创建指针时,使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

是否可以保证对std :: unordered_set元素的迭代顺序始终相同?

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

是否可以保证子选择的排序顺序?

是否可以保证JavaScript数组顺序?

互斥锁是否可以保证采集的顺序?

是否可以保证@PostConstruct方法的调用顺序?

移动unique_ptr后,std :: unique_ptr :: get返回的值是否有效?

将std :: list <std :: unique_ptr>移至向量尝试引用已删除的函数

使用std :: function对象将自定义删除器传递给std :: unique_ptr

C ++ std :: unique_ptr存储在std :: map内部,使用删除的函数会形成不良

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

可以将std :: unique_ptr子类化以透明地应用自定义删除程序吗?

如何将类的静态方法作为 std::unique_ptr 的删除器传递?

使用typedef为std :: unique_ptr指定自定义默认删除器

包装器使用普通函数删除器构建std :: unique_ptr

C ++将删除的函数std :: unique_ptr与基类一起使用

为什么我会得到编译错误“使用删除的功能'std :: unique_ptr ...”

如何安全地重载std :: unique_ptr的自定义删除程序?

std :: unique_ptr <T []>和自定义分配器删除器

未调用std :: unique_ptr中的自定义删除器

std :: unique_ptr <T []>具有派生对象的数组,使用已删除的函数

std :: unique_ptr使用带有很少参数的自定义删除器

双向链接列表std :: unique_ptr类在删除节点时无法按预期工作

带有lambda自定义删除程序的std :: unique_ptr无法编译