命名空间
变体
操作

std::default_delete

来自 cppreference.cn
< cpp‎ | memory
 
 
内存管理库
(仅为阐释*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*,已弃用)
(直到 C++20*,已弃用)
(直到 C++20*,已弃用)
显式生命周期管理
 
定义于头文件 <memory>
template< class T > struct default_delete;
(1) (自 C++11 起)
template< class T > struct default_delete<T[]>;
(2) (自 C++11 起)

当未指定删除器时,std::default_deletestd::unique_ptr 使用的默认销毁策略。 default_delete 的特化在典型的实现上是空类,并用于 空基类优化

1) 非特化的 default_delete 使用 delete 来解分配单个对象的内存。
2) 也为数组类型提供了使用 delete[] 的偏特化。

目录

[edit] 成员函数

(构造函数)
构造一个 default_delete 对象
(公有成员函数) [编辑]
operator()
删除对象或数组
(公有成员函数) [编辑]

std::default_delete::default_delete

constexpr default_delete() noexcept = default;
(1)
主模板特化
template< class U >
default_delete( const default_delete<U>& d ) noexcept;
(2) (自 C++11 起)
(constexpr 自 C++23 起)
数组特化
template< class U >
default_delete( const default_delete<U[]>& d ) noexcept;
(3) (自 C++11 起)
(constexpr 自 C++23 起)
1) 构造一个 std::default_delete 对象。
2) 从另一个 std::default_delete 对象构造一个 std::default_delete<T> 对象。
仅当 U* 可隐式转换为 T* 时,此重载才参与重载解析。
3) 从另一个 std::default_delete<U[]> 对象构造一个 std::default_delete<T[]> 对象。
仅当 U(*)[] 可隐式转换为 T(*)[] 时,此重载才参与重载解析。

参数

d - 要复制的删除器

注解

std::default_delete转换构造函数模板使得从 std::unique_ptr<Derived>std::unique_ptr<Base> 的隐式转换成为可能。

std::default_delete::operator()

主模板特化
void operator()( T* ptr ) const;
(1) (自 C++11 起)
(constexpr 自 C++23 起)
数组特化
template< class U >
void operator()( U* ptr ) const;
(2) (自 C++11 起)
(constexpr 自 C++23 起)
1)ptr 调用 delete
2)ptr 调用 delete[]
仅当 U(*)[] 可隐式转换为 T(*)[] 时,此重载才参与重载解析。
如果 U 是不完整类型,则程序是非良构的。

参数

ptr - 要删除的对象或数组

异常

无异常保证。

[edit] 对不完整类型调用

在代码中调用 operator() 的点,类型必须是完整的。 在某些实现中,使用 static_assert 来确保情况如此。 此要求的理由是,如果完整类类型具有非平凡析构函数或解分配函数,则在 C++ 中对不完整类型调用 delete 是未定义行为,因为编译器无法知道此类函数是否存在且必须被调用。

[edit] 注解

特性测试 Std 特性
__cpp_lib_constexpr_memory 202202L (C++23) constexpr 构造函数和 operator()

[edit] 示例

#include <algorithm>
#include <memory>
#include <vector>
 
int main()
{
//  {
//      std::shared_ptr<int> shared_bad(new int[10]);
//  } // the destructor calls delete, undefined behavior
 
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // OK: the destructor calls delete[]
 
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> uses default_delete<int>
 
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> uses default_delete<int[]>
 
    // default_delete can be used anywhere a delete functor is needed
    std::vector<int*> v;
    for (int n = 0; n < 100; ++n)
        v.push_back(new int(n));
    std::for_each(v.begin(), v.end(), std::default_delete<int>());
}

[edit] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 2118 C++11 数组特化的成员函数拒绝限定转换 接受

[edit] 参见

具有唯一对象所有权语义的智能指针
(类模板) [编辑]