最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

function template
<memory>

# std::destroy_n(C++17)

    namespace std {
      template <class ForwardIterator, class Size>
      ForwardIterator destroy_n(ForwardIterator first,
                                Size n);                         // (1) C++17

      template <class ForwardIterator, class Size>
      constexpr ForwardIterator destroy_n(ForwardIterator first,
                                Size n);                         // (1) C++20

      template <class ExecutionPolicy, class ForwardIterator, class Size>
      ForwardIterator destroy_n(ExecutionPolicy&& exec,
                                ForwardIterator first,
                                Size n);                         // (2) C++17

      template <class ExecutionPolicy, class ForwardIterator, class Size>
      constexpr ForwardIterator destroy_n(ExecutionPolicy&& exec,
                                          ForwardIterator first,
                                          Size n);               // (2) C++20
    }

## 概要

イテレータ範囲`[first, first + n)`の各要素に対してデストラクタを呼び出す。

この関数は、配置`new`で構築したオブジェクトの配列を破棄するために使用する。

## 効果

以下と等価：

    for (; n > 0; (void)++first, --n)
      destroy_at(addressof(*first));
    return first;

## 備考

- 非トリビアルなデストラクタをもたない`int`や`char`配列のような型のオブジェクトに対しては、デストラクタを呼び出す必要はない。`ForwardIterator`の値型`T`が`std::is_trivially_destructible_v<T> == true`である場合、 (効果欄の`for`文も含めて) なにもしない最適化が行われる可能性がある
  - 例として、`std::optional`クラスのデストラクタ、および`std::vector`クラスのデストラクタを参照

## 例

    #include <iostream>
    #include <memory>

    int main()
    {
      // 配置newで配列を構築
      char storage[4 * 3];
      int* n = new(storage) int[3];

      n[0] = 3;
      n[1] = 1;
      n[2] = 4;

      for (int i = 0; i < 3; ++i) {
        std::cout << n[i] << std::endl;
      }

      // デストラクタを呼び出して配列の各要素を破棄
      std::destroy_n(n, 3);
    }

### 出力

    3
    1
    4

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??

## 関連項目

- C++20 可変サイズをもつコンテナの`constexpr`化
- `ranges::destroy_n`

## 参照

- P0040R3 Extending memory management tools
- P0784R7 More `constexpr` containers