C样式对象删除的包装器

wrapper for C-style object deletion

本文关键字:包装 删除 样式 对象      更新时间:2023-10-16

我最近开始学习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库都有同样的问题。

我可以创建我的对象并像这样删除它

Shader x;
x.delete();

首先,delete是一个关键字,因此它可能不是函数的名称。

假设两次调用glDeleteShader是可以的,这是可以的。但对delete()函数的调用是多余的,因为析构函数会自动处理对glDeleteShader的调用。如果对glDeleteShader的重复调用是不可以的,那么调用delete()不仅是多余的,而且是一个错误。

Shader x;
delete(x);

其中函数delete()从内存中删除所有内容(与对象本身一起)。有可能吗。。。

无法通过调用函数从内存中删除自动存储持续时间的对象(除非用新对象替换存储,但这与此问题的主题相去甚远)。自动对象已从内存中删除当它们超出范围时自动

还是应该只使用指针?

没有,除非你需要。如果自动对象是一个选项,它们是更好的选项。只需这样做:

Shader x;
// glDeleteShader called when x is destroyed