- 浏览: 764249 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
shared_ptr早期叫做counted_ptr,它实现了引用计数型的智能指针,与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但可以被自由地拷贝和赋值。同时它弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。
share_ptr是强引用,像铁丝绑住堆上的对象,只要有一个指向x对象的shared_ptr存在,该x对象就不会析构,它是原子操作,没有用锁
不能使用常规的如static_cast之类的转型,要用就用static_pointer_cast<T>(),const_pointer_cast<T>(),dynamic_pointer_cast<T>()
shared_ptr能够存储void*型的指针,还可以定制删除器:
shared_ptr<void> p ((void*)0,delFun());
share_ptr是强引用,像铁丝绑住堆上的对象,只要有一个指向x对象的shared_ptr存在,该x对象就不会析构,它是原子操作,没有用锁
template<class T> class shared_ptr { public: typedef T element_type; //创建一个持有空指针的shared_ptr shared_ptr(); //获得指向类型T的指针p的管理权,同时引用计数=1.这个构造函数要求Y类型必须能够转换成T类型 template<class Y> explicit shared_ptr(Y *p); //和上面差不多,参数d指定了析构时的定制删除器 template<class Y,class D> shared_ptr(Y* p,D d); ~shared_ptr(); //从另一个shared_ptr获得指针的管理权,同时引用计数+1,然后两个shared_ptr共享一个指针的管理权 shared_ptr(shared_ptr const & r); //从一个auto_ptr获得指针的管理权,引用计数=1,同时auto_ptr自动失去管理权 template<class Y> explicit shared_ptr(std::auto_ptr<Y>& r); //从一个shared_ptr或auto_ptr获得管理权 shared_ptr & operator=(shared_ptr const & r); template<class Y> shared_ptr & operator=(shared_ptr<Y> const & r); template<class Y> shared_ptr & operator=(std::auto_ptr<Y> & r); //和scoped_ptr不完全一样,引用计数器-1,停止对指针的共享,改为管理另一个指针,如果引用计数<0,发生删除操作 void reset(); template<class Y> void reset(Y *p); template<class Y,class D> void reset(Y *p,D d); T & operator*()const; T * operator->()const; T * get() const; //在shared_ptr是指针的唯一所有者时返回true,比use_count()=1速度快,安全 bool unique()const; //一般用于测试 long use_count() const; operator unspecified-bool-type()const; void swap(shared_ptr & b); };
不能使用常规的如static_cast之类的转型,要用就用static_pointer_cast<T>(),const_pointer_cast<T>(),dynamic_pointer_cast<T>()
#include<boost/shared_ptr.hpp> #include<iostream> using namespace boost; using namespace std; int main() { shared_ptr<int> p(new int); *p = 10; cout << *p << endl; shared_ptr<int> p2 = static_pointer_cast<int>(p); cout << *p2 << endl; } 10 10
#include<boost/shared_ptr.hpp> #include<boost/scoped_ptr.hpp> #include<string> #include<iostream> using namespace boost; using namespace std; void print(shared_ptr<string> p) { cout << "count:" << p.use_count() << ",v=" << *p << endl; } int main() { shared_ptr<string> p(new string("abc")); cout << p.use_count() << endl; shared_ptr<string> p1(p); shared_ptr<string> p2(p); cout << p1.use_count() << "," << *p1 << endl; cout << p.use_count() << "," << *p << endl; cout << p2.use_count() << "," << *p2 << endl; print(p2);//内部函数拷贝了一个shared_ptr对象,引用计数+1 cout << p2.use_count() << "," << *p2 << endl;//自动析构,引用计数恢复 print(p1); print(p); } 1 3,abc 3,abc 3,abc count:4,v=abc 3,abc count:4,v=abc count:4,v=abc
#include<boost/shared_ptr.hpp> #include<iostream> #include<vector> using namespace boost; using namespace std; //桥接模式 class sample { private: class impl; shared_ptr<impl> p; public: sample(); void print(); }; class sample::impl { public: void print(){cout<<"impl"<<endl;} }; sample::sample():p(new impl){} void sample::print(){ p->print(); } int main() { typedef vector< shared_ptr<int> > v; v v1(5); int i=0; for(v::iterator iter=v1.begin();iter!=v1.end();++iter){ *iter = shared_ptr<int>(new int(++i)); cout << *(*iter) << endl; } sample s; s.print(); } 1 2 3 4 5 impl
#include<boost/shared_ptr.hpp> #include<iostream> using namespace std; using namespace boost; //工厂模式 class abstract { public: virtual void f()=0; virtual void g()=0; protected: virtual ~abstract(){} }; class impl:public abstract { public: virtual void f() { cout << "class impl f" << endl; } virtual void g() { cout << "class impl g" << endl; } }; shared_ptr< abstract> create() { return shared_ptr<abstract>(new impl); } int main() { shared_ptr<abstract> a = create(); a->f(); a->g(); } class impl f class impl g
shared_ptr能够存储void*型的指针,还可以定制删除器:
shared_ptr<void> p ((void*)0,delFun());
发表评论
-
multi_index_container
2018-08-11 13:04 458根据不同的类中不同的字段排序 #include < ... -
program_options读命令行和配置文件
2018-07-27 11:30 869#include <boost/program_opti ... -
centos下boost安装
2014-03-27 09:28 1061./booststarp.sh //这里的一些错误不用管 ... -
GC的改良
2013-10-17 22:05 577分代回收:对分配不久,诞生时间较短的“年龄”对象进行重点扫描, ... -
GC与引用记数
2013-10-16 21:57 696根(Root)就是判断对象是否可被引用的起始点。至于哪里才是根 ... -
boost 信号槽
2011-06-08 23:43 2321#include<boost/signals2.hp ... -
boost bind
2011-06-07 15:28 1689bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定 ... -
boost reference_wrapper
2011-06-05 21:07 1565reference_wrapper是一个引用类型的包装器 ... -
元编程
2011-06-02 22:46 934元编程的最大特点在于:某些用户自定义的计算可以在程序翻译期进行 ... -
参数化虚拟性
2011-06-02 22:17 865#include<iostream> usi ... -
boost any与variant
2011-05-31 15:55 2431any:是一种只能容纳一个元素的容器,但这个元素可以是任意类型 ... -
traits
2011-05-30 16:43 792#include<iostream> usi ... -
动静多态
2011-05-30 15:40 1066由于继承||虚函数在运行期进程处理,这种多态叫动多态。 模板允 ... -
局部特化
2011-05-29 16:27 1034局部特化并不会引入一个新的模板,它只对原来模板(基本模板)进行 ... -
类模板与模板类
2011-05-29 16:08 7071.类模板:该类是一个模板,他代表的是:整个类家族的参数化描述 ... -
boost tuple
2011-05-27 15:03 1088tuple(元组):定义了一个有固定数目元素的容器,其中的每个 ... -
boost array
2011-05-27 00:06 933array本质上是一个对静态数组的包装,没有构造函数,不能指定 ... -
单元测试
2011-05-23 22:00 889test库提供了一个最小化的测试套件minimal test. ... -
boost StaticAssert
2011-05-23 21:42 938static_assert库把断言的诊断时刻由运行期提前到编译 ... -
boost正则表达式
2011-05-17 23:10 2800xpressive是boost的正则表达式库,它比boost. ...
相关推荐
3. 从原始指针转换:`std::shared_ptr<T> ptrRaw(ptr_raw);`,其中`ptr_raw`是原始指针。 4. 从另一个`shared_ptr`复制:`std::shared_ptr<T> ptrCopy(ptrOther);`,这样两个`shared_ptr`将共享相同的引用计数。 ...
在 C++ 中,有四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,每种智能指针都有其特点和使用场景。 一、auto_ptr auto_ptr 是 C++98 中引入的智能指针,它可以自动释放动态分配的内存。但是,auto_...
shared_ptr arm, use arm asm code
C++ 智能指针(shared_ptr/weak_ptr)源码 源码位置:gcc-6.1.0\gcc-6.1.0\libstdc++-v3\include\tr1 这里只单列shared_ptr.h文件用于分析
### shared_ptr只能对new的内存操作 在C++标准库中,`std::shared_ptr`(在早期版本中可能使用`boost::shared_ptr`)是一种智能指针,它通过引用计数来管理动态分配的对象生命周期。`std::shared_ptr`的设计目的是...
参考陈硕的多线程服务端编程>>,中的用shared_ptr实现copy-on-write技术,不过这里的线程采用的是c++11的线程库
在实际操作中,为了使序列化过程更加简洁,通常会创建辅助类(如`shared_ptr_helper.cpp`和`shared_ptr_helper.hpp`中的类)来封装特定类型的智能指针的序列化和反序列化过程。例如,你可以创建一个`serialize`模板...
C++11 std::shared_ptr总结与使用示例代码详解 std::shared_ptr是C++11中引入的一种智能指针,主要用于自动管理资源的生命周期。下面是std::shared_ptr的总结和使用示例代码详解: 一、智能指针的用途 std::...
本文主要讨论了三种智能指针:`shared_ptr`、`unique_ptr`和`weak_ptr`。 首先,`shared_ptr`是引用计数型智能指针,它维护了一个内部的引用计数,用于跟踪有多少个`shared_ptr`实例指向同一对象。当创建一个新的`...
C++智能指针shared_ptr分析 概要: shared_ptr是c++智能指针中适用场景多,功能实现较多的智能指针。它采取引用计数的方法来实现释放指针所指向的资源。下面是我代码实现的基本功能。 实例代码: template class ...
在C++编程中,shared_ptr是智能指针的一种,它能够自动记录共享对象的引用次数,并且在引用计数降至零时自动删除对象,从而防止内存泄漏。shared_ptr是C++11标准中引入的,它解决了资源管理的问题,尤其是动态内存...
C++11智能指针之shared_ptr是一个非常重要且实用的特性,它为C++的动态内存管理提供了安全性和便利性。在C++中,动态分配的内存资源在使用完毕后必须被显式地释放,否则会造成内存泄漏。为了避免这种情况,传统的...
《shared_ptr线程安全性全面分析》 在C++的智能指针家族中,`shared_ptr`是一个重要成员,它提供了一种自动管理内存的方式,尤其是当多个指针共享同一对象时。`shared_ptr`的设计考虑到了多线程环境中的线程安全性...