2017-01-17 8 views
0

最近OpenGL(バージョン3.3を特定する)を学び始めました。また、いくつかの機能にはオブジェクト指向のデザインを使いたいと思っていました。たとえば、という名前のクラスShaderを作成して、テキストファイルからシェーダを読み込み、添付したり、デタッチしたりしたいと思います。問題はデストラクタです。私はオブジェクトを作成できCスタイルのオブジェクトを削除するためのラッパー

class Shader 
{ 
public: 

    // read from file - not important right now 
    Shader(){} 

    void delete() 
    { 
     glDeleteShader(); 
    }  

    ~Shader() 
    { 
     glDeleteShader(); 
    } 
}; 

(これは任意の詳細なしでこれだけのスケッチである)すべてのOpenGLオブジェクトは、その

glCreateShader() 
// some code here 
glDeleteShader() 

は、私はこのような私のクラスを設計するとしましょうように、多かれ少なかれ仕事と仮定し、この

Shader x; 
x.delete(); 

のようにそれを削除しますが、これはオブジェクト自体は削除されません - だけでOpenGLのシェーダのメモリを解放します。これは、このようなものを持つ方がよいでしょう。function delete()は、すべてのものをメモリから(オブジェクト自体を使って)削除します。それは可能ですか、それともポインタのみを使うべきですか?

Shader* x = new Shader(); 
delete x; 

私はどのCラ​​イブラリでも同じ問題があります。

+0

ここで答えを見つけることができます:http:// stackoverflow。com/questions/17161013/raii-wrapper-for-opengl-objects – roalz

+0

@Inline C++の詳細を学ぶだけで自分自身でやっています – Bociek

+0

スタック上のオブジェクトのデストラクタは、スコープから外れると自動的に呼び出されるので、この場合ポインタは必要ありません。それ以外に、私はヒープを扱うときに[スマートポインタ](http://en.cppreference.com/w/cpp/memory/shared_ptr)を使用するようアドバイスします。最後のポインタが消えるとデストラクタを呼び出します添付のメモリを解放します。 – Yemachu

答えて

1

私は私のオブジェクトを作成し、まずこの

Shader x; 
x.delete(); 

ようにそれを削除することができ、deleteはキーワードなので、関数の名前ではないかもしれません。

glDeleteShaderを2回呼んでも構わないとすれば、これは問題ありません。しかし、delete()関数の呼び出しは、デストラクタがglDeleteShaderへの呼び出しを自動的に処理するので、冗長です。 glDeleteShaderへの重複呼び出しがOKでない場合は、delete()を呼び出すことは冗長ではなくバグです。機能削除

Shader x; 
delete(x); 

()は、メモリから(オブジェクト自体に)すべてを除去します。それは

関数を呼び出して、メモリからの自動記憶域期間のオブジェクトを削除することはできません(あなたが新鮮なオブジェクトのストレージを交換しない限り、それはこの質問への道オフトピックです)...可能です。自動オブジェクトはメモリから削除されます... が範囲外になると自動的に削除されます。

私はポインタを使うべきですか?

いいえ、必要な場合を除きます。自動オブジェクトがオプションである場合、それらはより良いオプションです。単にこれを行う:

Shader x; 
// glDeleteShader called when x is destroyed 
関連する問題