• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <memory>

    std::destroy_n

    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;
    

    備考

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

    #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

    処理系

    関連項目

    参照