如何管理C++中不能深抄的资源?

问题描述 投票:0回答:1

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

但是,允许多个对象访问这个资源也是很危险的,因为一个对象可能会超出范围,并自毁,这也会破坏这个资源。在这种情况下,只定义一个移动构造函数(不允许浅层复制)是否合理?还是有什么办法支持浅层拷贝,让多个对象可以引用同一个资源,但如果至少有一个对象还能访问该资源,那么该资源就不会被销毁?

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

c++ memory-management c++17
1个回答
6
投票

我想你要找的是 std::shared_ptr 或并行解决方案。std::shared_ptr 用来共享指向单个对象的指针,只有在 的共享指针被清除。因此,虽然我们仍然有一个对象的引用,但它仍然有效。

即使您不希望使用 shared_ptr,其背后的想法是使用一个 参考计数器,它被所有引用同一资源的对象所共享--每次调用constructorcopy构造函数-赋值时,你都会将共享计数器增加1,在destructor中,你会将其减少1,如果(而且只有在)达到0,那么你就释放底层资源。

另外,为了保证答案的完整性,我应该补充一点,对于 std::shared_ptr此外,还有 std::weak_ptr它表示不共享所有权的访问--它允许一个人访问由一个人持有的资源。std::shared_ptr 生前但是,如果所有的 "小精灵 "都在,则可以自动复位。std::shared_ptr 的资源被销毁。很少看到它的使用,但还是有可能使用它。

© www.soinside.com 2019 - 2024. All rights reserved.