2012-01-20 41 views
61

標準正しくデストラクタからdelete[]を呼び出しstd::unique_ptrのテンプレートの特殊化を提供します:std::shared_ptrstd :: shared_ptr <T[]>の専門はなぜですか?

void func() 
{ 
    std::unique_ptr<int[]> arr(new int[10]); 

    ....... 
} 

この専門分野が利用できないので、正しくdelete[]を呼び出しデリータを提供するために、 に必要です。

void func() 
{ 
    // Usage 
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; }); 

    .............. 
} 

これは単に見落としですか? (同じ方法で、std::copy_ifがある)、または理由がありますか?

+3

N.Bを参照してください。 Boostの作業に基づいてC++ 17にこれを追加する新しい提案があります(http://open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3640.html –

+0

)。サブオブジェクトを参照する機能など、配列を操作するときは 'shared_ptr'機構の' –

答えて

65

LWG(C++委員会のライブラリワーキンググループ)は簡単に可能性を考えましたが、議論の余地はありませんでした。この論争は、主に投獄されたかもしれないshared_ptr<T[]>提案に追加された機能に関するものであった(算術計算shared_ptr<T[]>)。

最終的に実際の本当の理由は議論されたが、これを行うためにLWGの前に実際に書かれた提案はなかったということだ。それは、誰かの優先順位リスト(自分のものを含む)を泡立てて、提案を書くのに十分な時間を置くことはありませんでした。

いくつかのLWGメンバーの間で、非公式の会話が最近この話題で始まりました。私は個人的に試作しました。しかし、まだ書かれた提案はありません。私はそれがツールボックスのまともな追加ツールだと思う。それが実際に起こるかどうかは誰の推測でもありません。

更新

shared_ptrのための配列のサポートは今ドラフトTSあります。これは、現在C++ 17でサポートされて

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

アップデート(2017年)

を。ケース3のshared_ptr::shared_ptr()

+2

最初に「なぜそこにいないのですか...」と私が見た本当の答え、また動的に割り当てられた配列の質問? vectorとstd :: arrayを使用すると、本当に必要性が見えません(?) – Nim

+12

@Nim: 'std :: unique_ptr '(存在する)は、オーバーヘッドが非常に重要な場合に適しています。 'ベクトル'とは異なり、 'unique_ptr 'には、容量やさらにはサイズのオーバーヘッドは含まれません。クライアントはおそらく、サイズのために外部オーバーヘッドを追加する必要がありますが、配列のサイズが変更されることはありません。今これは 'unique_ptr 'をより良い 'ベクトル'にしません。確かに、前者のユースケースは後者に比べて稀ですと思います。しかし、ユース・ケース・レートは前者ではゼロではない。 –

+3

同様に、 'shared_ptr 'は、より低いオーバーヘッドで 'shared_ptr 'を置き換えることがあります。 'boost :: shared_array 'の単なる存在と継続的なサポートは、プログラマーの中には時にはこのようなツールが役立つことがあるとの議論になっています。 –

関連する問題