定义于头文件 <memory>

访问指向已销毁对象的 weak_ptr 时抛出的异常

class bad_weak_ptr;  (C++11 起) 

std::bad_weak_ptr 是 std::shared_ptr 以 std::weak_ptr 为参数的构造函数,在 std::weak_ptr 指代已被删除的对象时,作为异常抛出的对象类型。

成员函数

(构造函数)

构造 bad_weak_ptr 对象
(公开成员函数)

std::bad_weak_ptr::bad_weak_ptr

bad_weak_ptr() noexcept;

构造 std::bad_weak_ptr 的新实例。 what() 返回实现定义的空终止字节字符串。

参数

(无)

继承自 std::exception

成员函数

(析构函数)

[虚]

析构该异常对象
(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';}
}

输出

unique_ptr 的默认删除器

std::default_delete

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 智能指针-辅助类 (std::bad_weak_ptr)相关推荐

  1. c++11 智能指针 (std::shared_ptr)(一)

    定义于头文件 <memory> template< class T > class shared_ptr; (C++11 起) std::shared_ptr 是通过指针保持对 ...

  2. c++11 智能指针 (std::unique_ptr)(一)

    定义于头文件 <memory> template<class T,class Deleter = std::default_delete<T>> class uni ...

  3. c++11 智能指针 (std::unique_ptr)(六)

    定义于头文件 <memory> template< class T, class Deleter = std::default_delete<T>>class un ...

  4. 详解C++11智能指针

    详解C++11智能指针 前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用 ...

  5. 【C++11新特性】 C++11智能指针之weak_ptr

    http://blog.csdn.net/xiejingfa/article/details/50772571 原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/ar ...

  6. c++11新特性_【C++11新特性】 C++11智能指针之weak_ptr

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以 ...

  7. C++ 智能指针(二) std::unique_ptr

    C++ STL智能指针系列: C++ 智能指针(一) std::auto_ptr C++ 智能指针(二) std::unique_ptr C++ 智能指针(三) std::shared_ptr C++ ...

  8. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr

    C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...

  9. C++11 智能指针时要避开的 10 大错误

    我很喜欢C++11全新的智能指针,对于那些苦恼于自己管理内存的开发者来说,这是天大的好事.但是,在广泛使用C++11智能指针的两年里,因为使用方法不当而导致程序的效率下降甚至直接crash掉的事情发生 ...

最新文章

  1. android程序贴吧,【Android 教程总结贴】归纳所有android贴
  2. 郑宇、沈抖领衔共话 AI 业界应用挑战 | IJCAI 2019
  3. 开源网络备份软件bacula数据恢复(二)
  4. 微博php-sdk使用教程,腾讯微博api(php-sdk)的使用
  5. blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...
  6. BSTR、char*和CString转换
  7. android下m、mm、mmm编译命令的使用
  8. 半正定矩阵的判定方法_线性代数30——正定矩阵和最小值
  9. 动词ing形式的5种用法_英语语法这样学就对了!动词-ing结构的特征和四种形式是?...
  10. vim xxd命令查看二进制文件内容
  11. vs2008 编译libtorrent
  12. deploy owned private docker registry based on docker HUB registry image
  13. [转]C#自定义应用程序配置文件App.config
  14. z-index无效解决
  15. 如何写一份交互说明文档
  16. RubyInstaller
  17. 机器学习期末复习题题库-单项选择题
  18. ADB安装 apk 时,安装失败
  19. python 3d绘图旋转_Python:如何围绕z轴旋转曲面并进行三维绘图?
  20. 51单片机ADDA数模转换

热门文章

  1. 100g QSFP28光模块工作原理
  2. 基于Linux的Qt项目在windows下发布
  3. 4.CKeditor4.10.0最新图片上传配置
  4. Adaptive Deconvolutional Networks for Mid and High Level Feature Learning
  5. 小宋电脑工作室GHOST XP 贺岁版
  6. UE4蓝图第一人称转第三人称视角编辑(GameOver时)
  7. CCF认证历年真题 满分代码
  8. 360签名工具 linux,360apk签名工具-360apk签名工具(qihoo360 apk signer) 1.0 免费版 - 河东下载站...
  9. 随便玩玩-root用户下rm -rf /的后果
  10. 【漏洞通告】微软SMBv3协议远程代码执行漏洞(CVE-2020-0796)PoC公开处置手册