2012-12-10 8 views
5

は:shared_ptrをOpenGLに渡しますか?私は通常、このように機能するコードがある場合

char* log = new char[logLength]; 
glGetProgramInfoLog(..., ..., log) 
//Print Log 
delete [] log; 

をどのように私はC++ 11のスマートポインタと同じ結果を得ることができますか?私はその記憶を削除する機会がある前に何が起こるか知っています。

私はCスタイルのポインタにダウンキャストする必要があると思いますか?

+0

スマートポインタはC++ 11に排他的ではありません... – user1797612

+0

これは、あなたの質問に答えていませんが、私は単にのように 'ベクトルを'使用し、[この例](HTTPS: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49)。 –

答えて

5

スニペットのコードが実際にそのように見える場合、shared_ptrは、割り当てられたメモリの共有所有権を必要としないように見えるため、状況の過剰なビットです。 unique_ptrには、そのようなユースケースに最適な配列の部分的な特殊化があります。スコープ外に出たときにマネージポインタのdelete[]を呼び出します。道による

{ 
    std::unique_ptr<char[]> log(new char[logLength]); 
    glGetProgramInfoLog(..., ..., log.get()); 
    //Print Log 
} // allocated memory is released since log went out of scope 
3

std::shared_ptrには、getというメソッドがあり、これを使用して変数へのCスタイルのポインタを取得できます。そのポインタがstd::stringにある場合は、さらにc_str()関数を呼び出して、Cスタイルの文字列へのポインタを取得する必要があります。

編集:私は、この機能が読書とは対照的に文字列に書いていることに気づいています。最初にstd :: stringのサイズを変更する必要があります。さらにそれ以降はthe pointer returned by c_str isnt meant for writingです。 std :: shared_ptrはうまくいくはずです。

+0

書き込みには&str [0]を使用できます。 C++ 11では、これはうまく動作することを誇張しています(標準的には、割り当てられた記憶領域が必要です) – milleniumbug

関連する問題