定义于头文件
class bad_weak_ptr; (C++11 起)
std::bad_weak_ptr
是 std::shared_ptr 以 std::weak_ptr 为参数的构造函数,在 std::weak_ptr 指代已被删除的对象时,作为异常抛出的对象类型。
(构造函数) | 构造 bad_weak_ptr 对象 (公开成员函数) |
bad_weak_ptr() noexcept; |
构造 std::bad_weak_ptr
的新实例。 what()
返回实现定义的空终止字节字符串。
(无)
(析构函数) [虚] | 析构该异常对象 ( std::exception 的虚公开成员函数) |
what [虚] | 返回解释性字符串 ( std::exception 的虚公开成员函数) |
- #include <memory>
- #include <iostream>
- int main()
- {
- std::shared_ptr<int> p1(new int(42));
- std::weak_ptr<int> wp(p1);
- p1.reset();
- try
- {
- std::shared_ptr<int> p2(wp);
- }
- catch (const std::bad_weak_ptr& e)
- {
- std::cout << e.what() << '\n';
- }
- }
std::default_delete
template< class T > struct default_delete; | (1) | (C++11 起) |
template< class T > struct default_delete | (2) | (C++11 起) |
std::default_delete
是不指定删除器时 std::unique_ptr 所用的默认删除策略。
1) 非特化的 default_delete
用 delete 解分配单个对象的内存。
2) 亦为提供数组类型的使用 delete[] 的部分特化。
(构造函数) | 构造 default_delete 对象(公开成员函数) |
operator() | 删除对象或数组 (公开成员函数) |
constexpr default_delete() noexcept = default; | (1) | |
template | (2) | (仅为初等 default_delete 模板的成员) |
template | (3) | (C++17 起) (仅为数组 default_delete 特化的成员) |
1) 构造 std::default_delete
对象。
2) 从另一 std::default_delete
构造 std::default_delete
对象。此构造函数仅若 U*
可隐式转换为 T*
才参与重载决议。
3) 从另一 std::default_delete
对象构造 std::default_delete
对象。此构造函数仅若 U(*)[]
可隐式转换为 T(*)[]
才参与重载决议。
d | - | 复制来源的删除器 |
std::default_delete
的转换构造函数模板令从 std::unique_ptr
void operator()(T* ptr) const; | (1) | (C++17 起,不再是 default_delete 模板特化的成员) |
template | (2) | (仅为 default_delete 模板特化的成员,但 C++17 前定义为被删除) |
1) 在 2) 定义为被删除。 | (C++17 前) |
1) 在 2) 在 | (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>());
- }