解决unique_ptr在不同继承层次转化指针和deleter的问题
来源:互联网 发布:游戏程序员需要做什么 编辑:程序博客网 时间:2024/05/19 18:37
unique_ptr在多继承层次使用时,如果使用不当,容易出现
B* p = new D(); delete p;的问题
因此这里提出一个UniquePtr旨在正确处理析构。当然你需要付出一点小小的性能代价
包含文件
#include <memory>template<typename T>struct DeleteFuncs{ static void deleteFunc(void* obj) { delete (T*)obj; }};struct UniqueDeleter{ void(*m_deleter)(void*) = [](void*){}; UniqueDeleter(void(*func)(void*)) : m_deleter(func){} void operator()(void* ptr){ m_deleter(ptr); }};template<class _Ty, class... _Types> inline typename std::enable_if<!_STD is_array<_Ty>::value, _STD unique_ptr<_Ty, UniqueDeleter> >::type MakeUnique(_Types&&... _Args){ return (_STD unique_ptr<_Ty, UniqueDeleter>(new _Ty(_STD forward<_Types>(_Args)...), DeleteFuncs<_Ty>::deleteFunc));}template<typename T>using UniquePtr = typename std::unique_ptr<T, UniqueDeleter>;
测试代码
struct B{ ~B() { printf("~B()\n"); }};struct D : B{ ~D() { printf("~D()\n"); }};void deleteB(void* b){ printf("deleteB\n"); delete (B*)b;}void deleteD(void* d){ printf("deleteD\n"); delete (D*)d;}void test(){ puts(""); { UniquePtr<D> ptrD = MakeUnique<D>(); UniquePtr<B> ptrB = std::move(ptrD); } puts(""); { UniquePtr<B> ptrB{ new D, deleteD }; } puts(""); { UniquePtr<B> ptrB{ new B, deleteB }; } puts(""); { UniquePtr<B> ptrB{ new D, deleteD }; UniquePtr<D> ptrD = { (D*)ptrB.release(), ptrB.get_deleter() }; } puts(""); { UniquePtr<B> ptrB{ new D, deleteD }; UniquePtr<D> ptrD = std::move((UniquePtr<D>&) ptrB); } puts(""); { UniquePtr<B> ptrB{ new D, deleteD }; UniquePtr<D> ptrD = (UniquePtr<D>&&) ptrB; } puts("");}
阅读全文
0 0
- 解决unique_ptr在不同继承层次转化指针和deleter的问题
- 多继承指针转化的问题
- 不同数据类型以及指针之间的转化
- shared_ptr的 deleter, weak_ptr.lock 在多线程的运用举例
- C++智能指针 shared_ptr,unique_ptr和weak_ptr
- C++11 unique_ptr独占的智能指针
- unique_ptr的使用和陷阱
- unique_ptr的使用和陷阱
- boost :: scoped_ptr的和std ::的unique_ptr的区别 是之间的唯一不同boost::scoped_ptr<T>和std::unique_ptr<T>的事实std::uni
- 解决Lightmap在PC上与ios和Android上表现不同的问题
- C++:在多重继承时的指针转换问题
- 跟进问题“在每个节点中填充下一个正确的指针”。层次遍历二叉树
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
- C++ - 智能指针(smarter pointer)自定义删除器(deleter) 的方法 详解 及 代码
- 在不同浏览器用不同css 解决IE和其他浏览器问题
- 在不同浏览器用不同css 解决IE和其他浏览器问题
- 实战c++中的智能指针unique_ptr系列-- unique_ptr与lambda的错误结合(尤其是捕获lambda中的unique_ptr)
- 对机器学习的初步感悟 1
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
- css3深入了解之奇技淫巧
- No.01 "Hellworld"
- 常用Linux命令
- 解决unique_ptr在不同继承层次转化指针和deleter的问题
- 05-树7 堆中的路径 (25分)
- Spring框架(一)
- Matlab数组创建
- 最长不下降子序列
- Linux安全1-用户密码被暴力破解
- 图像处理库中图片缩放参数分析
- 从头到尾彻底理解傅里叶变换算法(上)
- 《Linux Shell编程从初学到精通(第2版)》pdf