◐ Shell
clean mode source ↗

std::destroy_n - cppreference.com

来自cppreference.com

在标头 <memory> 定义

template< class ForwardIt, class Size >
ForwardIt destroy_n( ForwardIt first, Size count );
(1) (C++17 起)
(C++20 起为 constexpr)
template< class ExecutionPolicy, class ForwardIt, class Size >
ForwardIt destroy_n( ExecutionPolicy&& policy, ForwardIt first, Size count );
(2) (C++17 起)

1) 如同用以下方式销毁从 first 开始的目标范围中的首 count 个元素:

for (; count > 0; (void) ++first, --count)
    std::destroy_at(std::addressof(*first));
return 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 - 要销毁的元素范围的起始
count - 要销毁的元素数目
policy - 所用的执行策略
类型要求
-ForwardIt 必须满足老式向前迭代器 (LegacyForwardIterator)
-通过 ForwardIt 合法实例的自增、赋值、比较或间接均不抛出异常。

返回值

如上所述。

异常

2) 在执行过程中:

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

示例

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

#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_n(ptr, 8);
}

输出:

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

参阅