命名空间
变体
操作

std::destroy_n

来自 cppreference.com
< cpp‎ | memory
 
 
实用程序库
语言支持
类型支持 (基本类型, RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
定义在头文件 <memory>
(1)
template< class ForwardIt, class Size >
ForwardIt destroy_n( ForwardIt first, Size n );
(自 C++17 起)
(直到 C++20)
template< class ForwardIt, class Size >
constexpr ForwardIt destroy_n( ForwardIt first, Size n );
(自 C++20 起)
template< class ExecutionPolicy, class ForwardIt, class Size >
ForwardIt destroy_n( ExecutionPolicy&& policy, ForwardIt first, Size n );
(2) (自 C++17 起)
1) 销毁从 first 开始的范围中的 n 个对象,如同使用
for (; n > 0; (void) ++first, --n)
    std::destroy_at(std::addressof(*first));
2)(1) 相同,但根据 policy 执行。此重载仅在

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>true 时参与重载解析。

(直到 C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>true 时参与重载解析。

(自 C++20 起)

内容

[编辑] 参数

first - 要销毁的元素范围的起始位置
n - 要销毁的元素数量
policy - 要使用的执行策略。有关详细信息,请参见 执行策略
类型要求
-
ForwardIt 必须满足 LegacyForwardIterator 的要求。
-
ForwardIt 的有效实例进行递增、赋值、比较或间接访问不得抛出异常。

[编辑] 返回值

已销毁对象的范围的结束位置(即 std::next(first, n))。

[编辑] 复杂度

n 成线性关系。

[编辑] 异常

具有名为 ExecutionPolicy 的模板参数的重载报告错误如下:

  • 如果作为算法的一部分调用的函数的执行抛出异常,并且 ExecutionPolicy标准策略 之一,则调用 std::terminate。对于任何其他 ExecutionPolicy,行为是实现定义的。
  • 如果算法未能分配内存,则抛出 std::bad_alloc

[编辑] 可能的实现

template<class ForwardIt, class Size>
constexpr // since C++20
ForwardIt destroy_n(ForwardIt first, Size n)
{
    for (; n > 0; (void) ++first, --n)
        std::destroy_at(std::addressof(*first));
    return first;
}

[编辑] 示例

以下示例演示了如何使用 destroy_n 来销毁连续的元素序列。

#include <iostream>
#include <memory>
#include <new>
 
struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " destructed\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}; //manually construct objects
 
    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));
 
    std::destroy_n(ptr, 8);
}

输出

0 destructed
1 destructed
2 destructed
3 destructed
4 destructed
5 destructed
6 destructed
7 destructed

[编辑] 另请参阅

(C++17)
销毁对象范围
(函数模板) [编辑]
销毁给定地址处的对象
(函数模板) [编辑]
销毁范围内的多个对象
(niebloid)[编辑]