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

履歴 編集

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;

備考

  • 非トリビアルなデストラクタをもたない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

処理系

関連項目

参照