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[] 的数组类型的部分特化。
目录 |
[编辑] 成员函数
(构造函数) |
构造一个 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]); // } // 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>()); }
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2118 | C++11 | 数组特化的成员函数拒绝限定转换 | 接受 |
[编辑] 另请参阅
(C++11) |
具有唯一对象所有权语义的智能指针 (类模板) |