最近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ライブラリでも同じ問題があります。
ここで答えを見つけることができます:http:// stackoverflow。com/questions/17161013/raii-wrapper-for-opengl-objects – roalz
@Inline C++の詳細を学ぶだけで自分自身でやっています – Bociek
スタック上のオブジェクトのデストラクタは、スコープから外れると自動的に呼び出されるので、この場合ポインタは必要ありません。それ以外に、私はヒープを扱うときに[スマートポインタ](http://en.cppreference.com/w/cpp/memory/shared_ptr)を使用するようアドバイスします。最後のポインタが消えるとデストラクタを呼び出します添付のメモリを解放します。 – Yemachu