头文件:<memory>
声明:
template< class T > struct default_delete; |
template< class T > struct default_delete<T[]>; |
std::default_delete 是不指定删除器时 std::unique_ptr 所用的默认删除策略。 default_delete 的特化在典型实现上为空类,并且用于空基类优化。
- 非特化的 default_delete 用 delete 解分配单个对象的内存。
- 亦为提供数组类型的使用 delete[] 的部分特化。
成员函数:
operator() \\ 删除对象或数组
void operator()(T* ptr) const; | 在 ptr 上调用 delete ,仅为初等 default_delete 模板的成员。 ptr:要删除的对象或数组 |
template <class U> void operator()(U* ptr) const; | 在 ptr 上调用 delete[] 。此函数仅若 U(*)[] 能隐式转换为 T(*)[] 才参与重载决议。任何情况下,若 U 是不完整类型,则程序为谬构。 仅为 default_delete<T[]> 模板特化的成员 ptr:要删除的对象或数组 |
#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>());
}