2011-07-15 6 views
33

スマートポインタはどのように配列を処理しますか? my_arrayがスコープの外に出ると、破壊されます場合は例えば、スマートポインタと配列

void function(void) 
{ 
    std::unique_ptr<int> my_array(new int[5]); 
} 

は、全体の整数配列を再主張し得るのでしょうか?アレイの最初の要素だけが再生されていますか?または、何か他のことが起こっていますか(未定義の動作など)?

答えて

63

それはdelete[]を呼び出します、したがって、アレイ全体が再生されますが、私はあなたがでunique_ptrの配列形式を使用していることを示す必要があると考えている:これは、の部分特殊と呼ばれている

std::unique_ptr<int[]> my_array(new int[5]); 

unique_ptr

+19

トリビア:これは、この構文が発明された場所です。http://groups.google.com/group/comp.lang.c++/browse_thread/thread/469fcc136b8f2d42/59c0491245293db7?q=%3Cchar%5B%5D%3E+グループ:comp.lang.c%2B%2B +著者:hinnant –

+5

@Howard Hinnant:トリビアのおかげで、私はそれについて知りませんでした。あなたはそれを発明した人です、2001年に戻って!それはあなたの周りにあなたを持っているのでとてもクールです:) –

+0

これはまた、意味を成す唯一の方法です。 'typedef int(three_ints)[3];テンプレート void function(void){unique_ptr p(new T); }関数(); ' –

2

編集:この回答は、以下のコメントで説明されているように、間違っていました。ここに私がもともと言ったことがあります:

私はstd :: unique_ptrがdelete []を呼び出すとは思いません。事実上、 にはメンバーとしてint *があります。int *を削除すると になるので、配列全体を削除するので、この場合は問題ありません。

通常の削除とは対照的にdelete []の唯一の目的は、 という配列の各要素のデストラクタを呼び出すことです。プリミティブ 型の場合は問題ありません。

私は何かを学んだので、ここに残しています - 他の人もそうですね。

+1

'new []'を使うと、 'delete []'を使うべきです。 'std :: unique_ptr'はこれを扱うだけでなく、すぐに' std :: auto_ptr'を置き換えるための他の多くの改良を処理するのに十分です。 – AJG85

+4

-1: 'delete'は常に' new'と一緒に使われなければなりません。同様に 'delete []'は常に 'new []'と一緒に使う必要があります。 C++ 2003、セクション5.3.5(expr.delete)、パラ2を参照してください。 –

+3

@Nathan:問題です。それはデストラクタだけではありません。メモリ割り当てルーチンは、一致する割り当て方法でメモリを削除することによって異なります。したがって、新しい/ deleteと新しい[]/delete []は一致するペアになります。 –

関連する問題