Tre*_*van 2 c++ memory-management c++17
我正在创建一个管理不应“深度复制”的资源的类,也就是说,底层资源只能有一个实例,即使多个对象访问了同一资源。
但是,允许多个对象访问此资源也很危险,因为一个对象可能会超出范围并自毁,这也会破坏资源。在这种情况下,只定义一个移动构造函数(不允许浅拷贝)是否合理?或者有没有办法支持浅拷贝,让多个对象可以引用同一个资源,但是如果至少有一个对象仍然可以访问该资源,则该资源不会被销毁?
对于上下文,被管理的资源是一个 OpenGL 着色器,每个对象都有这个着色器的 ID 作为它的成员之一,它用来告诉 OpenGL 在必要时删除着色器。
我认为您正在寻找std::shared_ptr或并行解决方案;std::shared_ptr用于共享指向单个对象的指针,只有在所有共享指针都被清除后才会销毁该对象。因此,虽然我们仍然拥有对对象的引用,但它仍然有效。
即使您不打算使用shared_ptr,其背后的想法也是使用引用计数器,该计数器由引用同一资源的所有对象共享 - 每次调用构造函数/复制构造函数/复制赋值时,都会增加共享计数器减 1,在析构函数中,将其减 1,如果(且仅当)它达到 0,则释放底层资源。
此外,为了答案的完整性,我应该补充一点,对于std::shared_ptr,还有std::weak_ptr,它表示没有共享所有权的访问 - 它允许一个人访问std::shared_ptr 它活着时持有的资源,但如果所有的都可以自动重置std::shared_ptr指的是资源被销毁。很少看到它的使用,但仍然可以使用它。