天天看点

引用计数与智能指针引用计数智能指针

C++没有完善的GC机制,直到C++11才在STL中正式引入了智能指针。出现在库中说明智能指针不是语言特性。C++智能指针实现了部分自动内存管理的目的。

引用计数

引用计数是使用资源管理函数(构造析构复制等函数)和作用域原理实现的。每块动态分配的内存(堆内存)都维护一个相应的计数器,来记录指向该内存的变量数目,当值为0时,意味着没有变量再使用该部分内存,意味着可以删除掉。

引用计数的优缺点

引用计数会根据作用域来实时动态的释放内存,效率极高,这是它的优点。但是它也有巨大的缺点,就是循环引用,循环引用后的引用计数永不为0,就会造成内存泄漏。这时候就需要其他的GC算法来解决了。

智能指针

智能指针使用引用计数方法来管理内存

C++智能指针示例

template <typename T>
class Ptr {
public:
	Ptr()
	{ }

	explicit Ptr(T * ptr)
		: ptr_(ptr)
	{
		refcnt_ = new int(1);
	}

	Ptr(const Ptr<T>& other)
	{
		ptr_ = other.ptr_;
		refcnt_ = other.refcnt_;

		// 引用+1
		refX(refcnt_, 1);
	}

	Ptr& operator=(const Ptr<T>& other)
	{
		ptr_ = other.ptr_;
		refcnt_ = other.refcnt_;
		refX(refcnt_, 1);

		return *this;
	}

	~Ptr()
	{
		if (refcnt_ && refX(refcnt_, -1) == 1) {
			delete ptr_;
			delete refcnt_;
			ptr_ = nullptr;
			refcnt_ = nullptr;
		}
	}

	T * get() const { return ptr_; }
private:

	int refX(int * rc, int delta)
	{
		int val = *rc;
		*rc += delta;
		return val;
	}

	T * ptr_ = nullptr;
	int * refcnt_ = nullptr;
};

class A {};

int main()
{
	Ptr<A> a(new A());
	Ptr<A> c;

	{
		auto b = a;

		{
			c = a;
		}
	}

	return 0;
}
           

继续阅读