Как управлять ресурсами, которые нельзя глубоко скопировать в C ++ - PullRequest
2 голосов
/ 29 мая 2020

Я создаю класс, который управляет ресурсом, который не должен подвергаться «глубокому копированию», то есть может быть только один экземпляр базового ресурса, даже если несколько объектов имеют доступ к этому же ресурсу.

Однако разрешение множеству объектов доступа к этому ресурсу также опасно, поскольку один объект может go выйти за пределы области видимости и самоуничтожиться, что также уничтожит ресурс. В этом случае, разумно ли определять только конструктор перемещения (без учета мелких копий)? Или есть какой-то способ поддерживать мелкие копии, чтобы несколько объектов могли ссылаться на один и тот же ресурс, но ресурс не будет уничтожен, если хотя бы один объект все еще имеет доступ к ресурсу?

Для контекста ресурс управляемым является шейдер OpenGL, и каждый объект имеет идентификатор этого шейдера в качестве одного из его членов, который он использует, чтобы сообщить OpenGL об удалении шейдера при необходимости.

1 Ответ

6 голосов
/ 29 мая 2020

Думаю, что вы ищете std::shared_ptr или параллельное решение; std::shared_ptr используется для разделения указателей на один объект, который уничтожается только после того, как все общих указателей очищены. Таким образом, хотя у нас все еще есть ссылка на объект, она остается действительной.

Даже если вы не собираетесь использовать shared_ptr, идея заключается в использовании счетчика ссылок , который используется всеми объектами, которые относятся к одному и тому же ресурсу - каждый раз, когда вы вызываете конструктор / конструктор копирования / присваивание копии, вы увеличиваете общий счетчик на 1, а в деструкторе вы уменьшаете его на 1, и если ( и только если ) он достигает 0, вы освобождаете базовый ресурс.

Кроме того, для полноты ответа я должен добавить это для std::shared_ptr, там кроме того, std::weak_ptr, что означает доступ без совместного владения - он позволяет получить доступ к ресурсу, удерживаемому std::shared_ptr , пока он жив , но может быть сброшен автоматически, если все std::shared_ptr, относящиеся к ресурсу, уничтожаются. Его редко можно увидеть, но, тем не менее, его можно использовать.

...