共享指针shared_ptr
就是用了一个类来绑定一个对象,这个智能指针是在栈上,当栈回收共享指针的引用计数会减1,为0时释放这个对象资源,将堆区的资源绑定到栈区让系统回收。
#include <iostream>
using namespace std;
// 使用模板
template <class T>
class SharePtr
{
public:
// 构造函数函数
SharePtr(T* ptr = NULL) :key(ptr), size(new int(1)) {
}
virtual ~SharePtr() {
decrease();
}
// 获得T的指针
T* get() {
return key;
}
// 拷贝构造函数
SharePtr(const SharePtr& p) {
key = p.key;
size = p.size;
(*size)++;
}
// 重载 =
SharePtr& operator = (const SharePtr& ptr) {
decrease();
key = ptr.key;
size = ptr.size;
(*size)++;
return *this;
}
// 获的引用计数
int use_count() {
return *size;
}
private:
T* key;
int* size;
void decrease() {
// 引用计数--,如果引用计数为0,释放这个对象
if (size != NULL) {
if (--(*size) == 0) {
delete key;
delete size;
size = NULL;
}
}
}
};
class Base
{
public:
Base() {
cout << "函数构造了" << endl;
}
~Base() {
cout << "函数析构了" << endl;
}
};
int main()
{
SharePtr<Base>p(new Base);
cout <<"p的指针"<< p.get()<<endl;
cout <<"p的引用计数"<< p.use_count() << endl; // 1
SharePtr<Base>q(new Base);
cout << "q的指针" << q.get()<<endl;
cout <<"q的引用计数"<< q.use_count() << endl; // 1
p = q;
cout << "p的指针" << p.get()<<endl;
cout <<"q的指针"<< p.get()<<endl;
cout << "q的引用计数" << q.use_count() << endl; // 2
cout << "p的引用计数" << p.use_count() << endl; // 2
}