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;
}