gpt4 book ai didi

c++ - C++中如何管理无法深复制的资源

转载 作者:行者123 更新时间:2023-12-02 00:54:42 38 4
gpt4 key购买 nike

我正在创建一个类,该类管理不应“深度复制”的资源,也就是说,即使多个对象访问同一资源,底层资源也只能有一个实例。

但是,允许多个对象访问此资源也是危险的,因为一个对象可能超出范围并自毁,这也会破坏资源。在这种情况下,仅定义移动构造函数(不允许浅拷贝)是否合理?或者是否有某种方法支持浅拷贝,以便多个对象可以引用同一资源,但如果至少有一个对象仍然可以访问该资源,则该资源不会被销毁?

就上下文而言,被管理的资源是一个 OpenGL 着色器,每个对象都将该着色器的 ID 作为其成员之一,它用它来告诉 OpenGL 在必要时删除该着色器。

最佳答案

我认为您正在寻找 std::shared_ptr 或并行解决方案; std::shared_ptr 用于共享指向单个对象的指针,只有在所有共享指针被清除后,该对象才会被销毁。因此,虽然我们仍然拥有对该对象的引用,但它仍然有效。

即使您不想使用shared_ptr,其背后的想法也是使用引用计数器,它由所有人共享引用相同资源的对象 - 每次调用构造函数/复制构造函数/复制赋值时,都会将共享计数器增加 1,并且在析构函数中,将其减少 1,并且 if (且仅当)它达到 0,然后您释放底层资源。

另外,为了答案的完整性,我应该补充一点,对于 std::shared_ptr,还有 std::weak_ptr,它表示没有共享所有权的访问- 它允许访问由 std::shared_ptr 当它处于事件状态时持有的资源,但如果所有的引用资源的 std::shared_ptr 被销毁。很少看到它的用法,但仍然可以使用它。

关于c++ - C++中如何管理无法深复制的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62093255/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com