std::vector とは異なり、初期化されていないストレージを許可するベクターコンテナーを構築したいとしましょう。たとえば、コンテナの使用法は、vec <T>
おおよそ次のようになります。
ユーザーは、ベクトルが N 個の初期化されていない要素を次のように割り当てる必要があると明示的に述べています。
vec <T> a(N, no_init);
データが既知の時点で、ユーザーは
n
引数を使用して position で要素を明示的に初期化しますargs...
。a.init(n, args...);
または、同等に、要素を手動で構築します。
new (&a[n]) T(args...);
他の操作は、より大量に初期化またはコピーする場合があります ( など
std::uninitialized_copy
) が、これは便宜上のものにすぎません。基本的な操作は同じです。いくつかのタスクを完了した後、ベクトルには初期化された要素と初期化されていない要素が残る場合があります。ベクトルは余分な情報を保持しないため、最終的にはメモリを解放する前に、とにかくすべての要素を破棄するか、に応じてのみ破棄し
T
ます。
私はこれができると確信していますが、結果についてはわかりません。T
当然のことながら、ユーザーが構築前に初期化されていない要素を使用しようとしないことを前提として、この構造がすべての型に対して安全であることを望みます。これは強い仮定のように聞こえるかもしれませんが、ベクトルの範囲内でのみ要素にアクセスすることは、それほど異なる仮定ではなく、非常に一般的です。
だから私の質問は:
のように、この種の初期化されていない操作を許可しても安全なのはどのタイプ
vec <T> a(no_init)
ですか? 私is_pod
は大丈夫だと思いますし、おそらくそうis_trivial
です。必要以上の制約を加えたくありません。破棄は常に実行する必要がありますか、それとも一部の型に対してのみ実行する必要がありますか? 上記と同じ制約で問題ありませんか? どう
is_trivially_destructible
ですか?構築されていない要素を破棄したり、その逆 (構築された要素を破棄しない) が害を及ぼすべきではないという考え方です。ユーザーにより多くの責任を負わせる明らかなリスク以外に、この試みに重大な欠陥はありますか?
要点は、ユーザーがパフォーマンスのためにそのような機能を必要とする場合、低レベルのソリューションstd::get_temporary_buffer
や手動割り当て (たとえば を使用operator new()
) は、リークに関してよりリスクが高い可能性があるということです。私は知ってstd::vector::emplace_back()
いますが、それは実際には同じことではありません。