2017-04-04 10 views
1

のためのスマートポインタの使用「項目16:newdeleteの用途に対応するのと同じ形式を使用します」スコット・マイヤーズ効果的なC++のを、あなたはauto_ptr(またはtr1::shared_ptr)に動的に割り当てられた配列を置くべきではありませんdelete[] pの代わりにdelete pが破壊時に呼び出されます(answersも参照)。しかし、これはまだC++ 11 <以上、特にstd::shared_ptrstd::unique_ptrのために保持されますか?私はいくつかのオープンソースコードにstd::unique_ptr<uint8_t[]>の使用を気付いたので、後者が正しい場合、どのようにしてnewnew []を割り振ることができますか?に基づいて、C++での動的に割り当てられた配列

+0

( 'bool'以外の、多分、依存する)配列に対して' std :: vector'を使用してください。これは、C++の標準動的サイズ配列です。 –

+2

http://en.cppreference.com/w/cpp/memory/unique_ptrを参照して、ポイント(2)を参照してください。ノート –

答えて

4

std::unique_ptrは、std::shared_ptrではなく、C++ 11の配列タイプに特化しています。したがって、std::unique_ptr<uint8_t[]>delete []と呼ばれますが、std::shared_ptr<uint8_t[]>はデフォルトでdeleteを呼び出します。

この動作はC++ 17では変更されています。 C++では、std::shared_ptrは配列型に特化されており、std::shared_ptr<uint8_t[]>を使用するとdelete []が呼び出されます。

2

後者は正しく、unique_ptrは配列でうまく動作します。それはdelete[]を呼び出す配列タイプのためのテンプレート特化を持っています。それにもかかわらず、Scott MeyersのEffective Modern C++では、スマートポインタの代わりにstd::arrayまたはstd::vectorを使用することが推奨されています。

+0

彼はまた、 'boost :: scoped_array'と' boost :: shared_array';を使用することを提案します。配列型のテンプレート特殊化へのリンクを提供していますか? – Matthias

+2

@MatthiasはRichard Crittenのコメントを見て、彼はcppreferenceへのリンクを提供しています。テンプレートのインスタンス化はlibstdC++コード内にあります。 –

関連する問題