Вот сценарий: у меня есть класс с именем Program, который содержит три shared_ptr: для вершинного, геометрического и фрагментного шейдера. Когда создается объект Shader, он создает шейдер с помощью glCreateShader, а также компилирует его.
Денструктор Shader автоматически вызывает glDeleteShader. Итак, проблема в том, что если я сделаю следующее:
- Создайте объект шейдера;
- Скопируйте его;
- Уничтожить копию.
Также исходная копия становится недействительной, потому что когда копия уничтожается, она вызывает glDeleteShader. Я считаю, что это проблема дизайна.
Поэтому я избежал этой проблемы, просто используя указатели. Теперь класс Program содержит шейдеры. Я создал метод, который возвращает shared_ptr вершинным, геометрическим и фрагментным шейдерным объектам. Я сомневаюсь: должен ли я возвращать shared_ptr следующим образом:
const shared_ptr<Shader>& getVertex_shader_ptr() const
{
return vertex_shader_ptr;
}
Или вот так:
shared_ptr<Shader> getVertex_shader_ptr() const
{
return vertex_shader_ptr;
}
Я боюсь, что проблема, описанная выше, возникнет снова: shared_ptr освобождается, и это делает шейдер OpenGL недействительным.