Namespaces
Variants

std:: default_delete

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <memory>
template < class T > struct default_delete ;
(1) (C++11 起)
template < class T > struct default_delete < T [ ] > ;
(2) (C++11 起)

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

1) 非特化的 default_delete 使用 delete 来释放单个对象的内存。
2) 同时提供了针对数组类型的偏特化版本,该版本使用 delete [ ]

目录

成员函数

(constructor)
构造 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 起)
(C++23 起为 constexpr)
数组特化
template < class U >
default_delete ( const default_delete < U [ ] > & d ) noexcept ;
(3) (C++11 起)
(C++23 起为 constexpr)
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 起)
(C++23 起为 constexpr)
数组特化
template < class U >
void operator ( ) ( U * ptr ) const ;
(2) (C++11 起)
(C++23 起为 constexpr)
1) ptr 调用 delete
2) ptr 调用 delete [ ]
仅当 U(*)[] 可隐式转换为 T(*)[] 时,此重载参与重载决议。
U 是不完整类型,则程序非良构。

参数

ptr - 要删除的对象或数组

异常

不提供异常保证。

对不完整类型的调用

在代码中调用 operator ( ) 时,类型必须是完整的。某些实现会使用 static_assert 来确保这一点。此要求的原因是:在 C++ 中对不完整类型调用 delete 会导致未定义行为——如果完整类类型具有非平凡析构函数或释放函数,编译器无法获知这些函数是否存在且需要被调用。

注释

功能测试 标准 功能
__cpp_lib_constexpr_memory 202202L (C++23) constexpr 构造函数与 operator ( )

示例

#include <algorithm>
#include <memory>
#include <vector>
int main()
{
//  {
//      std::shared_ptr<int> shared_bad(new int[10]);
//  } // 析构函数调用 delete,未定义行为
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // 正确:析构函数调用 delete[]
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> 使用 default_delete<int>
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> 使用 default_delete<int[]>
    // default_delete 可用于任何需要删除函数对象的地方
    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>());
}

缺陷报告

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

缺陷报告 应用于 发布时的行为 正确行为
LWG 2118 C++11 array特化的成员函数拒绝限定转换 接受

参阅

(C++11)
具有独占对象所有权语义的智能指针
(类模板)