情景二:下面的函数也是 factory函数来生成一个shared_ptr指针,但是p指针通过返回值返回了,所以,如果有另一个shared_ptr指针调用了该函数,那么该p所指向的内存地址不会随着use_factory函数的调用而释放 代码语言:javascript 复制 autouse_factory(Targ){shared_ptr<Foo>p=factory(arg);returnp;} 六、shared_ptr与new...
“弱引用计数”用来保存当前正在指向此基础对象的weak_ptr指针的个数,weak_ptr会保持控制块的生命周期,因此有一种特殊情况是:强引用的引用计数已经降为0,没有shared_ptr再持有基础对象,然而由于仍有weak_ptr指向基础对象,弱引用的引用计数非0,原本因为强引用计数已经归0就可以释放的基础对象内存,现在变成了“强引用...
上面的代码可以使用shared_ptr来改写,更简单: #include<memory> //使用shared_ptr需要包含这个头文件usingnamespacestd;voidg(void){shared_ptr<int>ptr=make_shared<int>();//手动申请一个堆上的无名int变量,交给智能指针对象ptr来管理intb;//这里无须手动释放ptr指向的内存,ptr的析构函数会释放}voidf(void)...
shared_ptr<int>p1(newint(2)); 代码语言:javascript 复制 SharedPointer(T*ptr=nullptr,conststd::function<void(T*)>&del=Deleter()):p(ptr),use_c(newstd::size_t(ptr!=nullptr)),deleter(del){} 涉及到的Deleter放在最后来讲。 采用new返回的指针初始化shared_ptr,调用构造函数,在堆上开辟一块存储...
shared_ptr的简单实现 代码语言:javascript 复制 #include<iostream>#include<mutex>#include<thread>using namespace std;template<classT>classShared_Ptr{public:Shared_Ptr(T*ptr=nullptr):_pPtr(ptr),_pRefCount(newint(1)),_pMutex(newmutex){}~Shared_Ptr(){Release();}Shared_Ptr(constShared_Ptr<T>...
从源代码中可以看到_Sp_counted_ptr是_Sp_counted_base的派生类,并且__shared_count在初始化_M_pi时用的也是_Sp_counted_ptr。 接着看_M_dispose方法的实现,里面确实删除了一开始shared_ptr接管的指针,_M_destroy方法用于释放自己的内存(由__shared_count调用),和前面猜想一致...
shared_ptr实现代码(只实现核心功能) #include <iostream> using namespace std; template<class T> class shared_ptr{ private: T* m_ptr; //被封装的指针 unsigned int shared_count; //引用计数,表示有多少个智能指针对象拥有m_ptr指向的内存块
1. shared_ptr 介绍 使用过Boost的话对shared_ptr一定有很深的印象。多个shared_ptr指向同一个对象,每个shared_ptr会使对象的引用计数加+1,当引用计数为0时, 对象将被析构。本文实现一个简洁版本的shared_ptr,并没有太多跨平台特性,实现代码可以再GCC上运行。
正确的做法是将原始指针赋给智能指针后,以后的操作都要针对智能指针了。参考代码如下: 1{2shared_ptr<int> temp1(newint(5));3assert(temp1.use_count() ==1);4shared_ptr<int>temp2(temp1);5assert(temp2.use_count() ==2);6}//temp1和temp2都离开作用域,引用次数变为0,指针被销毁。
Stl 中 auto_ptr只是众多可能的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。 这里是一个简单的代码示例,如果没有auto_ptr, void ProcessAdoption(istream &data) 2 { 3 4 while (data) // 如果还有数据