std:: default_delete
|
定义于头文件
<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
的特化是空类,并用于
空基类优化
。
default_delete
使用
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) |
std::default_delete
对象。
std::default_delete
对象构造
std::default_delete<T>
对象。
U*
可隐式转换为
T*
时参与重载决议。
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) |
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)
|
具有独占对象所有权语义的智能指针
(类模板) |