std::default_delete
来自 cppreference.com
定义在头文件 <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 | - | 要删除的对象或数组 |
异常
无异常保证。
[edit] 在不完整类型上调用
在代码中调用 operator() 的位置,该类型必须是完整的。在某些实现中,使用 static_assert 来确保这种情况。此要求的原因是,如果完整类类型具有非平凡的析构函数或释放函数,则在不完整类型上调用 delete 在 C++ 中是未定义的行为,因为编译器无法知道是否存在这些函数,并且必须调用它们。
[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) |
具有唯一对象所有权语义的智能指针 (类模板) |