1.smart_ptr
1.1)scoped_ptr和auto_ptr,不能作为容器的元素,auto_ptr是因为其转移语义,scoped_ptr则是因为不支持拷贝和赋值,不符合容器对元素的要求。
1.2)unique_ptr简直是auto_ptr的改进版,auto_ptr就默默地退出舞台吧。
unique_ptr可以代理new和new[]。
1.3)shared_ptr的reset和scoped_ptr不同,shared_ptr的reset被调用时,引用计数-1(计数为0时释放原指针)
1.4)shared_ptr的use_count()应该仅仅用于测试,不提供高效率操作。unique比use_count()==0快。
1.5)对于shared_ptr不能使用类似static_cast<T*>(ptr.get())的形式,这将使cast之后的指针无法再被shared_ptr正确管理。
1.6)shared_ptr应用:桥接模式和工厂模式。定制删除器,这个可有用了,如:shared_ptr<FILE> fp(fopen("a.txt","r"),fclose);高级应用shared_ptr<void>.
1.7)shared_array的operator[]不提供数组的范围检查。
1.8)weak_ptr主要用于协助shared_ptr,它不具有普通指针的行为,没有operator*,->。从shared_ptr构造,但是不共享资源,计数不会+1或-1.
用途之一,获得this指针的shared_ptr,实现于:enable_shared_from_this。
1.9)循环引用:
class node
{
public:
...
shared_ptr<node> next;//使用weak_ptr代替,操作时再调用lock()
};
int main()
{
auto p1=make_shared<node>();
auto p2=make_shared<node>();
p1->next=p2;
p2->next=p1;
//p1.use_count()==2
//p2.use_count()==2
}
p1,p2析构时,由于use_count==2,都不释放资源,会造成泄漏。
1.10)instructive_ptr侵入式引用计数。
1.11)pool。malloc()从内存池任意分配一个内存块,ordered_malloc()则在分配的同时合并空闲块链表。
pool在分配内存失败的时候不会抛出异常,所以malloc时候检查返回值是否为空。
1.12)singleton_pool所有成员都是静态的,生命周期和程序一样。