这是场景:我有一个名为 Program 的类,它包含三个 shared_ptr:到顶点、几何和片段着色器。当 Shader 对象被构造时,它会使用 glCreateShader 创建着色器,并且还会编译它。
Shader denstructor 会自动调用 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 着色器无效。