我最近开始学习OpenGL(版本3.3是具体的),我也想对某些功能使用一些面向对象的设计。例如,我想创建一个名为 Shader 的类,它从文本文件中读取着色器,附加,分离等等。我遇到的问题是析构函数。我想所有的OpenGL对象都或多或少地工作
glCreateShader()
// some code here
glDeleteShader()
让我说我像这样设计我的课程(这只是一个草图所以没有任何细节)
class Shader
{
public:
// read from file - not important right now
Shader( ){}
void delete()
{
glDeleteShader();
}
~Shader()
{
glDeleteShader();
}
};
我可以创建我的对象并像这样删除它
Shader x;
x.delete();
但这不会删除对象本身 - 只释放OpenGL着色器的内存。有这样的东西会更好
Shader x;
delete(x);
其中函数delete()从内存中删除所有内容(使用对象本身)。是可能的,还是应该只使用指针?
Shader* x = new Shader();
delete x;
我对任何C库都有同样的问题。
答案 0 :(得分:1)
我可以创建我的对象并像这样删除它
Shader x; x.delete();
首先,delete
是关键字,因此它可能不是函数的名称。
假设可以两次调用glDeleteShader
,这没关系。但是对delete()
函数的调用是多余的,因为析构函数会自动处理对glDeleteShader
的调用。如果对glDeleteShader
的重复调用不正常,则调用delete()
不仅是多余的,而且是一个错误。
Shader x; delete(x);
其中函数delete()从内存中删除所有内容(使用对象本身)。有可能......
无法通过调用函数从内存中删除自动存储持续时间的对象(除非您使用新对象替换存储,但这与此问题的主题不同)。自动对象从内存中删除... 在超出范围时自动。
或者我应该只使用指针?
不,除非你需要。如果自动对象是一个选项,它们是更好的选择。只需这样做:
Shader x;
// glDeleteShader called when x is destroyed