pkwv 's Blog
Toggle navigation
pkwv 's Blog
主页
About Me
归档
标签
智能指针 smart pointer
shared_ptr
c++
2017-06-15 23:25:32
202
0
0
pkwv
shared_ptr
c++
# 智能指针 ## 种类 > tr1::shared_ptr: 当引用计数为0时,自动delete该对象;**但是**不能解决有环的情况 > tr1::weak_ptr: 为了解决shared_ptr有环的问题(挖个坑,不了解 > std::unique_ptr: (不了解 ## shared_ptr 实现对原成员函数的调用 `->` 这个操作符比较特殊,这个操作符返回的对象会重复调用此操作符,直到返回值为 raw pointer,然后调用相应的成员函数 > 运算符 -> 的重载比较特别,它只能是非静态的成员函数形式,而且没有参数。如果返回值是一个原始指针,那么就将运算符的右操作数当作这个原始指针所指向类型的成员进行访问;如果返回值是另一个类型的实例,那么就继续调用这个返回类型的 operator->() ,直到有一个调用返回一个原始指针为止,然后按第一种情况处理。 > 如果上述条件不满足(如:右操作数不是返回的原始指针指向的类型的成员,或者,返回的非指针类型没有重载 operator->() ),那么编译将报错。 参考 [Kelvin](https://kelvinh.github.io/blog/2013/11/20/overloading-of-member-access-operator-dash-greater-than-symbol-in-cpp/) 的博客 ## shared_ptr 实现 template<typename T> class my_shared_ptr { public: my_shared_ptr(T* const p) : _p(p),_reference_count(new unsigned int(1)) {} my_shared_ptr(const my_shared_ptr& ptr) : _p(ptr.get_ptr()), _reference_count(ptr.get_ref()) { ++*(_reference_count); } T* get_ptr() const { return _p; } unsigned int * get_ref() const { return _reference_count; } my_shared_ptr& operator = (const my_shared_ptr& ptr) { _p = ptr.get_ptr(); _reference_count = ptr.get_ref(); ++*(_reference_count); } T* operator-> () const { return _p; } T operator*() const { return *_p; } ~my_shared_ptr() { --*(_reference_count); if(*(_reference_count)==0) { delete _p; delete _reference_count; } } private: T* _p; unsigned int *_reference_count; }; 参考 [雨停就走](http://www.jianshu.com/p/0300b2d833af) 的博客 ## gnu smart pointer 实际上,shared_ptr能做更多的事情,因为可以传入**自定义的deleter**(deleter是用来在引用为0的时候删除对象的) 所以我们可以不删除对象,改成对变量的加锁。 gnu c++也不是简单的如上实现的,而是将deleter以及 ptr传入counter,由counter来管理对于ptr的删除操作。
上一篇:
The Best Mask
下一篇:
Linux 制作U盘启动
0
赞
202 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册