std::default_delete
来自 cppreference.cn
定义于头文件 <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[] 的偏特化。
目录 |
[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] 参见
(C++11) |
具有唯一对象所有权语义的智能指针 (类模板) |