用于删除C风格对象的包装器

时间:2017-01-17 09:36:09

标签: c++ opengl

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

1 个答案:

答案 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