あなたが動的に割り当てられた配列のバージョンをunique_ptrを使用する必要があります。
std::unique_ptr<std::list<int>[]> map1(new std::list<int>[10]);
^^ ~~~~~ !
はこちらをご覧ください:http://en.cppreference.com/w/cpp/memory/unique_ptr:
template <
class T,
class Deleter
> class unique_ptr<T[], Deleter>;
また、あなたは得ることになるとstd::make_uniqueを(コメントで示唆したように)使用することができます
std::unique_ptr<std::list<int>[]> up1 = std::make_unique<std::list<int>[]>(10);
auto up2 = std::make_unique<std::list<int>[]>(10);
のように、UBの代わりにエラーをコンパイルします。
しかし、このコードは正常に実行されました。
unique_ptr map2(新しいint [10]);
まだ未定義のコード上記のコードでは、動作していない可能性があります。上記のunique_ptrは任意のポインタを受け取りますが、デストラクト中は常にdelete
を呼び出します。動的に割り当てられた配列を指すポインター上でdelete
を呼び出すことはUBです。それでdelete[]
を呼び出す必要があります。そして、これは動的に割り当てられた配列のためのunique_ptr
です。
両作品ののタイプに
type[]
を使用する必要がコンストラクタでnew[]
を使用しようとしているのであればnew[]
編てきた何かに
delete
を呼び出すために未定義の動作ですコードには未定義の動作があり、壊れています。 –[this](http://stackoverflow.com/questions/16711697/is-there-any-use-for-unique-ptr-with-array)を参照してください。 – Incomputable
Aリストとリスト [10 ] 'は二つの異なる型です –
NathanOliver