C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- std::addressof
- std::allocator_traits
- std::default_delete
- std::allocator_arg_t
- std::allocator_arg
- std::weak_ptr
- std::enable_shared_from_this
- std::bad_weak_ptr
- std::unique_ptr
- std::scoped_allocator_adaptor
- std::auto_ptr
- std::destroy_at
- std::destroy
- std::destroy_n
- std::uninitialized_move
- std::uninitialized_value_construct
- std::owner_less
- std::shared_ptr
- std::to_address
- std::assume_aligned
- std::make_obj_using_allocator
- C 内存管理库
- 低层内存管理
- std::pmr::memory_resource
- std::allocator
- std::pointer_traits
- std::uses_allocator
- std::uses_allocator_construction_args
- std::uninitialized_construct_using_allocator
- std::pmr::polymorphic_allocator
- std::pmr::get_default_resource
- std::pmr::set_default_resource
- std::pmr::new_delete_resource
- std::pmr::null_memory_resource
- std::pmr::synchronized_pool_resource
- std::pmr::unsynchronized_pool_resource
- std::pmr::monotonic_buffer_resource
- std::pmr::pool_options
- std::raw_storage_iterator
- std::get_temporary_buffer
- std::return_temporary_buffer
- std::uninitialized_copy
- std::uninitialized_fill
- std::uninitialized_default_construct
- std::uninitialized_copy_n
- std::uninitialized_fill_n
- std::uninitialized_move_n
- std::uninitialized_default_construct_n
- std::uninitialized_value_construct_n
- std::construct_at
- std::align
- 注释
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
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 所用的默认删除策略。
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) | (仅为初等 default_delete 模板的成员) |
template<class U> default_delete( const default_delete<U[]>& d) noexcept; |
(3) | (C++17 起) (仅为数组 default_delete 特化的成员) |
1) 构造
std::default_delete
对象。2) 从另一
std::default_delete
构造 std::default_delete
对象。此构造函数仅若 U*
可隐式转换为 T*
才参与重载决议。3) 从另一
std::default_delete<U[]>
对象构造 std::default_delete<U[]>
对象。此构造函数仅若 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++17 起,不再是 default_delete<T[]> 模板特化的成员) |
template <class U> void operator()(U* ptr) const; |
(2) | (仅为 default_delete<T[]> 模板特化的成员,但 C++17 前定义为被删除) |
1) 在
ptr 上调用 delete (初等模板)或 delete[] (数组特化)。2) 定义为被删除。
|
(C++17 前) |
1) 在
ptr 上调用 delete 。2) 在 ptr 上调用 delete[] 。此函数仅若 U(*)[] 能隐式转换为 T(*)[] 才参与重载决议。
|
(C++17 起) |
任何情况下,若 U 是不完整类型,则程序为病式。
参数
ptr | - | 要删除的对象或数组 |
异常
无异常保证。
在不完整类型上调用
于代码中调用 operator() 点,类型必须完整。一些实现中用 static_assert
确保如此。此要求的原因,是 C++ 中若完整类类型拥有非平凡析构函数或解分配函数,则在不完整类型上调用 delete 是未定义行为,因为编译器无法得知这种函数是否存在且必须被调用。
示例
运行此代码
#include <memory> #include <vector> #include <algorithm> 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[] , ok { 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++11) |
拥有独有对象所有权语义的智能指针 (类模板) |