2016-04-14 25 views
0

この単純なコードはコンパイルできます。リストのunique_ptrを作ることができません<int>配列

unique_ptr<list<int>> map1(new list<int>[10]); 

ただし、実行中にseg falutが発生します。

malloc関数:オブジェクト0x7fe02a4032e8ため*エラー:解放され、ポインタが* しかし、このコードが正常に実行された

をデバッグするmalloc_error_breakにブレークポイントを設定して割り当てられていませんでした。

unique_ptr<int> map2(new int[10]); 

なぜunique_ptrを使用してリストの配列を作成できないのですか?

ありがとうございます。

+2

両作品ののタイプにtype[]を使用する必要がコンストラクタでnew[]を使用しようとしているのであればnew[]

てきた何かにdeleteを呼び出すために未定義の動作ですコードには未定義の動作があり、壊れています。 –

+0

[this](http://stackoverflow.com/questions/16711697/is-there-any-use-for-unique-ptr-with-array)を参照してください。 – Incomputable

+2

Aリストとリスト [10 ] 'は二つの異なる型です – NathanOliver

答えて

4

あなたが動的に割り当てられた配列のバージョンを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です。

+2

これは、型を間違えることを不可能にするために、 'std :: make_unique'を使うべき理由です。 – GManNickG

+0

良い点、私はこれを回答に含めました – marcinj

0

は何が必要です:

std::unique_ptr<std::list<int>[]> map1(new std::list<int>[10]); 

Live Demo

1

A list<int>list<int>[10]は二種類あります。あなたは

unique_ptr<list<int>> 

を持っている場合あなたはlist<int>を指すように起こっていることをunique_ptr語っています。 unique_ptrが有効範囲外になると、deleteが呼び出され、基になるポインタが削除されます。 Unfortunetlyあなたはdelete []ないdeleteで削除する必要がある

new list<int>[10] 

でそれを初期化します。これは最初のバージョンは失敗しないと第二のUndefined behaviorを?:しないのはなぜ

unique_ptr<int> map2(new int[10]); 

でも同じです。

あなたがunique_ptr

関連する問題