2

私はVC++ 2005を実行しているのでstd::unique_ptr、利用できません。私はいくつかのライブラリ関数 (ブラック ボックス) を効果的に使用してreturn new T[n]おり、結果をいくつかのオブジェクトにラップしたいので、デストラクタでそれらを削除する必要はありません。

VC++ 2008 年頃の標準ライブラリには何か存在しますか? そうでない場合、unique_ptr のブースト バージョンはこの回答のように完全に機能しますか?

コメントの混乱を明確にするために、ライブラリ関数は動的に割り当てられた配列への生のポインターを返しますが、それを変更するアクセス権がありません...そのポインターを取得してdelete []、オブジェクトは範囲外になります。

4

2 に答える 2

0

結果の値で何をしたいかによって異なります。

一般的に、私はC++03をお勧めboost::scoped_ptrします。boost::scoped_arrayただし、リソースの範囲を制限するという非常に具体的な考え方で作成されていることに注意してください。つまり、クリーンアップを処理するだけでなく、リソースがスコープを離れないこと、つまり呼び出し元に転送できないことも保証します。

さらに必要な場合は、C++03 では簡単ではありません (可動型がないため)。この場合、「拡張」を作成する必要がある場合があります。たとえば、呼び出し元にメモリを渡すことができるようにboost::scoped_ptrするメソッドを追加しreleaseます (呼び出し元は、メモリを適切に処理することを期待しています)。

于 2012-07-17T09:49:15.803 に答える
0

2011年より前の標準ライブラリではauto_ptr、関数から戻るのに適した しかありません。ただし、配列ではなく単一のオブジェクトでのみ機能するため、この用途には適していません。

私が知る限りunique_ptr、ブーストにはありません。scoped_ptrとがありますが、scoped_arrayそれらは転送できないため、関数から返すことはできません。

boost::shared_array参照カウントを使用するため、単一所有権ポインターと比較して (できれば小さい) オーバーヘッドがありますが、適切な場合があります。

std::vector良い選択かもしれません。コンパイラが「戻り値の最適化」をサポートしている限り、不要なメモリの割り当てやコピーを行わずに (少し注意して) 関数から値を返すことができます。ただし、データの偶発的なコピーを防止できないという欠点があります。

更新: あなたの質問に「ブラック ボックス」という言葉が含まれていることに気付きました。これは、ライブラリ関数が生のポインターを返すことを意味していると思われますdelete []。関数自体を変更します。その場合boost::scoped_arrayは、トリックを行う必要があり、私のコメントに応じて回答を削除した人々に謝罪します.

于 2012-07-17T08:50:51.800 に答える