std::destroy

来自cppreference.com
 
 
算法库
受约束算法及范围上的算法 (C++20)
包含算法例如 ranges::copyranges::sort、...
排序和相关操作
划分操作
(C++11)    

排序操作
二分搜索操作(在已划分范围上)
集合操作(在有序范围上)
归并操作(在有序范围上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比较操作
排列操作




 
 
在标头 <memory> 定义
template< class ForwardIt >
void destroy( ForwardIt first, ForwardIt last );
(1) (C++17 起)
(C++20 前)
template< class ForwardIt >
constexpr void destroy( ForwardIt first, ForwardIt last );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt >
void destroy( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last );
(2) (C++17 起)
1) 如同用以下方式销毁目标范围 [firstlast) 中的元素:
for (; first != last; ++first)
    std::destroy_at(std::addressof(*first));
2)(1),但按照 policy 执行。
此重载只有在以下表达式的值是 true 时才会参与重载决议:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20 前)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20 起)

参数

first, last - 要销毁的元素范围的迭代器对
policy - 所用的执行策略
类型要求
-
ForwardIt 必须满足老式向前迭代器 (LegacyForwardIterator)
-
通过合法 ForwardIt 实例的自增、赋值、比较或间接均不抛出异常。

异常

2) 在执行过程中:
  • 如果并行化所需的临时内存资源不可用,那么就会抛出 std::bad_alloc
  • 如果在通过算法实参访问对象时抛出了未捕获的异常,那么行为由执行策略决定(标准策略会调用 std::terminate)。

可能的实现

template<class ForwardIt>
constexpr // C++20 起
void destroy(ForwardIt first, ForwardIt last)
{
    for (; first != last; ++first)
        std::destroy_at(std::addressof(*first));
}

示例

下列示例演示如何用 destroy 销毁元素的相接序列。

#include <iostream>
#include <memory>
#include <new>

struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " 已析构\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 8];
    
    for (int i = 0; i < 8; ++i)
        new(buffer + sizeof(Tracer) * i) Tracer{i}; // 手工构造对象

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    std::destroy(ptr, ptr + 8);
}

输出:

0 已析构
1 已析构
2 已析构
3 已析构
4 已析构
5 已析构
6 已析构
7 已析构

参阅

(C++17)
销毁范围中若干对象
(函数模板 & 算法函数对象)[编辑]
销毁给定地址的对象
(函数模板 & 算法函数对象)[编辑]
销毁范围中的对象
(算法函数对象) [编辑]