对智能指针简单说就是: 它有可能如此的智能以至于能够“知道”它自己是不是“指向某物”的最后一个指针,并运用这样的知识,在它的确是该对象的最后一个拥有者而且它被删除时,销毁它所指向的对象。自c++11起,C++标准库提供两大类型的smart pointer:
1. Class shared_ptr实现共享式拥有概念,多个智能指针可以指向相同的对象,该对象和其相关资源会在“最后一个引用被销毁”时被释放。标准库还提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。
shared_ptr在真正释放资源的时候会调用在创建它是指定的deleter,如果没有指定,会调用默认的,而且它本身不会像unique_ptr一样的,可以接受数组类型模板参数,这就导致了shared_ptr想要管理数组的时候,需要额外指定,代码如下所示:
-
shared_ptr<int> p(new int[10]);// 编译ok,但是释放时有问题
-
shared_ptr<int> p(new int[10],[](int* p){delete[] p;});
-
shared_ptr<int> q(new int[10],std::default_delete<int []>());
-
unique_ptr<int []> r(new int[10]);
-
shared_ptr<int []> s(new int[10]); // 编译会报错
另外,shared_ptr只提供operator*和operator->,如果想访问内存,必须使用shared_ptr包覆的内部指针,提供完全的指针语义,如:smp.get()[i] 语义上等同于:(&*smp)[i]
Class wea_ptr:
为避免shared_ptr循环引用等问题,这里引入了weak_ptr, 它的值来自于shared_ptr但是不增加其引用计数,不支持解引用操作,可以通过lock来升级出一个新的shared_ptr
2. Class unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。可以移交使用权。它对于避免资源泄露特别有用
所有智能指针类都定义在头文件内
阅读(1657) | 评论(0) | 转发(0) |