是否保证std::unique_ptr的删除顺序
Is std::unique_ptr deletion order guaranteed?
我正在创建一个控制我的应用程序的全局单例,并且我希望子系统以特定的顺序启动和关闭。
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
时首先构建displayManager
,然后构建renderer
。当App
实例被销毁时,renderer
将首先被销毁,然后displayManager
将被销毁。
还要注意在
中App::App()
{
displayManager = std::unique_ptr<DisplayManager>(new DisplayManager);
renderer = std::unique_ptr<Renderer>(new Renderer);
}
您正在对默认构造的unique_ptr
s进行赋值。您需要使用像
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>()) {}
如果您不想默认构造指针,然后对其进行赋值,
是,销毁顺序是有保证的。
每个deleter将在当前的std::unique_ptr
被销毁后立即被调用ref,并且当std::unique_ptr
同时离开作用域ref时,它们将以与其构造相反的顺序被销毁。
但是,这个顺序与App::App()
—你可以把它们调换一下,没有什么变化。App
中std::unique_ptr
s声明的顺序才是最重要的。
因此,尽管销毁顺序是有保证的,但它可能不是您期望的顺序。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 删除[] 的行为 (ptr, 0)
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 如何从集合中删除共享的 PTR 元素
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 删除PTR C 后会发生什么
- 如何删除带有 int ptr 指向它的数组
- 数据突然从 Boost shared_array/ptr 中删除
- c++中新建和删除ptr包装器类
- 删除ptr时堆损坏
- openv Ptr类.指针对象在调用函数后被删除
- 删除从函数返回的唯一ptr
- 当可以在类对象超出范围之前删除此数据时,类允许访问其数据(通过 ptr/it)是否设计不好