web-dev-qa-db-ja.com

スマートポインターと配列

スマートポインターは配列をどのように処理しますか?例えば、

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

いつ my_arrayはスコープから外れて破壊されます。整数配列全体が再要求されますか?配列の最初の要素のみが再生されますか?または、何か未定義の動作などが起こっていますか?

43
helloworld922

delete[]を呼び出すため、配列全体が再生されますが、unique_ptrbyの配列形式を使用していることを示す必要があると思います。

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

これはunique_ptrの-​​Partial Specializationと呼ばれます。

74
Alok Save

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

Std :: unique_ptrがdelete []を呼び出すことを知っているとは思わない。事実上、メンバーとしてint *があります。int*を削除すると、配列全体が削除されるため、この場合は問題ありません。

通常の削除とは異なり、delete []の唯一の目的は、配列内の各要素のデストラクターを呼び出すことです。プリミティブ型の場合は関係ありません。

私は何かを学んだので、ここに残します-他の人もそうすることを望みます。

3