智能指针(续)
来源:互联网 发布:centos鼠标键盘动不了 编辑:程序博客网 时间:2024/06/07 01:42
一. 存在问题
上文到第三种智能指针shareptr,但是此指针也存在很多的问题
- 若传入文件类型指针FILE *,则delete不能释放;
- 引用计数的处理不是线程安全的
- 循环引用问题
二.解决方法
- 若传入文件类型指针FILE *,则delete不能释放;
- 解决方法:特化
class Fclose{public: void operator()(FILE* fp) { if(fp) fclose(fp); }};template <class T>class Delete{public: void operator()(T*p) { if(p) delete p; }}template <class T>class Free{public: void operator()(T*p) { if(p) free p; }}template <class T,class Del= Delete<T>>class SharePtr{ //构造函数同上 //拷贝构造函数同上 SharedPtr<T>& operator=(SharedPtr<T> sp) { if(this!= &sp) { Release(); _ptr = sp._ptr; _pCount = sp._pCount; ++(*_pCount); } return *this; } ~SharedPtr() { cout << "~SharedPtr()" << endl; Release(); } private: void Release() { if(_ptr && 0==--(*pCount)) { Del()(_ptr); _ptr = NULL; delete _pCount; _pCount = NULL; } }};
- 引用计数的处理不是线程安全的
#include<memory>template<class T>struct Node{ Node(const T&data) :_next(NULL) ,_pre(NULL) ,_data(data) { cout<<"Node()"<<endl; } ~Node() { cout<<"~Node()"<<endl; }share_ptr<Node<T>> _next;//以前_next交给一个原生态指针管理,现在交给share_ptr管理share_ptr<Node<T>> _ptr;T _data;};void Test(){ share_ptr<Node<T>> p1(new Node<int>(1)); share_ptr<Node<T>> p2(new Node<int>(1)); cout<<p1.use_count()<<endl; cout<<p2.use_count()<<endl; p1->_next = p2; p2->_pre = p1; cout<<p1.use_count()<<endl; cout<<p2.use_count()<<endl;}
打印结果为
Node()
Node()
1
1
2
2
问题
以上打印结果可知,并没有调用析构函数,故会造成内存泄漏
循环引用:针对那些两个指针的节点,可以引发引用循环的问题
- 循环引用问题
struct Node{ Node(const T&data) :_data(data) {} weak_ptr<Node<T>> _next;//weak_ptr依附于share_ptr,不能单独使用; weak_ptr<Node<T>> _pre;}
阅读全文
0 0
- 智能指针(续)
- 智能指针续
- 智能指针(待续)
- 智能指针(smart_pointer)
- 智能指针(二)
- 智能指针(一)
- 智能指针(二)
- C++智能指针(一)智能指针的简单介绍
- 指针(4)智能指针的使用
- 指针(3)智能指针总览
- 管理指针成员(智能指针)
- boost域指针(智能指针)测试
- C++智能指针(转载)
- 智能指针(引用计数)
- 智能指针(smart pointer)
- 87 智能指针(一)
- Android 智能指针(1)
- c++智能指针(1)
- Git简明操作
- py-faster-rcnn在Windows下的end2end训练
- 1099. Build A Binary Search Tree (30)
- 关于token的一些内容
- Java入门代码示例--面向对象
- 智能指针(续)
- 第25课 Spark Hash Shuffle源码解读与剖析
- 高频交易从零开始
- 吾念汝
- 猿生活
- 实例探索Java模式之路——多例模式
- Java入门代码--IO
- 数字图像处理与机器视觉——与后台图像交换swap():error C2039: “difference_type”: 不是“CImgProcess”的成员
- kali--快捷键开启终端(新建快捷键)