c++11 智能指针-辅助类 (std::bad_weak_ptr)
定义于头文件 <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> |
(2) |
(仅为初等 default_delete 模板的成员)
|
template<class U> |
(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> |
(2) |
(仅为 default_delete<T[]> 模板特化的成员,但 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>());
}
c++11 智能指针-辅助类 (std::bad_weak_ptr)相关推荐
- c++11 智能指针 (std::shared_ptr)(一)
定义于头文件 <memory> template< class T > class shared_ptr; (C++11 起) std::shared_ptr 是通过指针保持对 ...
- c++11 智能指针 (std::unique_ptr)(一)
定义于头文件 <memory> template<class T,class Deleter = std::default_delete<T>> class uni ...
- c++11 智能指针 (std::unique_ptr)(六)
定义于头文件 <memory> template< class T, class Deleter = std::default_delete<T>>class un ...
- 详解C++11智能指针
详解C++11智能指针 前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用 ...
- 【C++11新特性】 C++11智能指针之weak_ptr
http://blog.csdn.net/xiejingfa/article/details/50772571 原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/ar ...
- c++11新特性_【C++11新特性】 C++11智能指针之weak_ptr
如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以 ...
- C++ 智能指针(二) std::unique_ptr
C++ STL智能指针系列: C++ 智能指针(一) std::auto_ptr C++ 智能指针(二) std::unique_ptr C++ 智能指针(三) std::shared_ptr C++ ...
- 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 原创)智能指针拾遗 (原创)智能指 ...
- C++11 智能指针时要避开的 10 大错误
我很喜欢C++11全新的智能指针,对于那些苦恼于自己管理内存的开发者来说,这是天大的好事.但是,在广泛使用C++11智能指针的两年里,因为使用方法不当而导致程序的效率下降甚至直接crash掉的事情发生 ...
最新文章
- android程序贴吧,【Android 教程总结贴】归纳所有android贴
- 郑宇、沈抖领衔共话 AI 业界应用挑战 | IJCAI 2019
- 开源网络备份软件bacula数据恢复(二)
- 微博php-sdk使用教程,腾讯微博api(php-sdk)的使用
- blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...
- BSTR、char*和CString转换
- android下m、mm、mmm编译命令的使用
- 半正定矩阵的判定方法_线性代数30——正定矩阵和最小值
- 动词ing形式的5种用法_英语语法这样学就对了!动词-ing结构的特征和四种形式是?...
- vim xxd命令查看二进制文件内容
- vs2008 编译libtorrent
- deploy owned private docker registry based on docker HUB registry image
- [转]C#自定义应用程序配置文件App.config
- z-index无效解决
- 如何写一份交互说明文档
- RubyInstaller
- 机器学习期末复习题题库-单项选择题
- ADB安装 apk 时,安装失败
- python 3d绘图旋转_Python:如何围绕z轴旋转曲面并进行三维绘图?
- 51单片机ADDA数模转换
热门文章
- 100g QSFP28光模块工作原理
- 基于Linux的Qt项目在windows下发布
- 4.CKeditor4.10.0最新图片上传配置
- Adaptive Deconvolutional Networks for Mid and High Level Feature Learning
- 小宋电脑工作室GHOST XP 贺岁版
- UE4蓝图第一人称转第三人称视角编辑(GameOver时)
- CCF认证历年真题 满分代码
- 360签名工具 linux,360apk签名工具-360apk签名工具(qihoo360 apk signer) 1.0 免费版 - 河东下载站...
- 随便玩玩-root用户下rm -rf /的后果
- 【漏洞通告】微软SMBv3协议远程代码执行漏洞(CVE-2020-0796)PoC公开处置手册