一、概述
shared_ptr实现了引用计数的功能,在引用计数为0时,自动delete掉管理的对象。
二、实现要点
- shared_ptr需要实现构造对象以及赋值时的计数。
- shared_ptr需要实现自身销毁时的计数减少。
- 需要实现计数为0时自动销毁管理的对象。
- 需要实现std::move语义。
- 要处理多线程下的计数问题。
三、shared_ptr的简单实现源码
#pragma once
#include <memory>
#include <atomic>
using namespace std;
template<class T> class MyRefCount
{
private:
atomic<long> _uses; //atomic使用CPU级的控制,保证多个线程,一个在修改时,其他线程查看和修改回退。
T* _ptr;
//long weaks; 这个用来处理weak_ptr,本代码不做实现
void destory()
{
delete _ptr; //计数为0后,调用实际对象的析构函数
}
public:
MyRefCount(T* ptr)
{
_ptr = ptr;
_uses = 1;
}
void incRef()
{
_uses++;
}
void decRef()
{
_uses--;
if (_uses == 0)
{
destory();
}
}
long use_count()
{
return _uses;
}
};
template<class T> class MySharedPtr
{
private:
T* _ptr;
MyRefCount<T