1.引用计数管理内存的原理
C++新标准库中采两个智能指针类型来管理动态对象,share_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指对象。
对于share_ptr<T>我们可以按如下方式使用去管理堆内存,相比于new,省去使用delete去释放内存的麻烦。
void use_factory(T arg)
{
share_ptr<Foo> p = factory(arg);
Foo *ptr = new Foo(arg);
//使用P
}//p离开了作用域,但它指向的内存会被释放掉
//ptr申请的内存没有被释放,造成了内存泄漏
我们知道指针或引用在离开作用域时是不会进行析构的,但类在离开作用域时会自动执行析构函数(从这也可看出share_ptr本质是类,只是模仿出指针使用的效果而已),因此,
我们可以通过析构函数调用delete去销毁资源。
那share_ptr如何实现多个类同时指向同一个对象,这就产生了引用计数,它实际是一个整形指针,让多个
对象共享其指向的对象,该对象记录着当前有多少个对象在共享同一变量。
share_ptr<Foo> get_factory(T arg)
{
share_ptr<Foo> p = factory(arg); //引用计数值为1,同时new一个Foo对象
share_ptr<Foo> tmp = factory(arg);