5

通常は次のように機能するコードがある場合:

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

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

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

4

2 に答える 2

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
于 2012-12-10T04:16:46.613 に答える
3

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

編集:関数が読み取りではなく文字列に書き込みを行っていることに気付きました。最初にstd::stringのサイズを変更する必要があります。その後でも、c_strによって返されるポインターは書き込み用ではありません。std::shared_ptrは動作するはずです。

于 2012-12-10T03:29:49.137 に答える