namespace std { template <class ForwardIterator, class Size> ForwardIterator destroy_n(ForwardIterator first, Size n); // (1) template <class ExecutionPolicy, class ForwardIterator, class Size> ForwardIterator destroy_n(ExecutionPolicy&& exec, ForwardIterator first, Size n); // (2) }
概要
範囲[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++: ??