理解智能指针从三个层面:
1. 智能指针使用RAII(资源获取初始化)对普通的指针进行封装,使得智能指针实质上是一个对象,行为表现的却像一个指针。
2.指针把值语义转化成引用语义
std::auto_ptr, boost::shared_ptr, unique_str, weak_str
1.std::auto_ptr(已被摒弃):不支持复制(拷贝构造函数)和赋值(operator =),直接赋值不会编译出错,很大的缺陷是所有权的转移,就是一个对象的内存块智能呗一个智能指针对象所拥有。
原因:
auto_ptr<string> ps (new string("I reigned lonely as a cloud."))
auto_ptr<string> vocation;
vocation = ps;
上述代码试图将两个指针指向同一个对象,会导致程序删除一个对象两次
避免这种问题的几个解决办法:
1.定义赋值运算,执行深复制,这样两个指针将指向不同的对象,其中一个对象是另一个对象的副本
2.建立所有权概念,对于特定的对象,只能有一个指针可拥有它。这样只有拥有对象的智能指针的构造函数会删除该对象。
3.创建智能更高的指针,跟踪引用特定对象的智能指针数。称为引用计数。
2.unique_str:
上述赋值代码会报编译错误
3.shared_ptr:可以作为STL容器的元素,用于管理单个堆内存对象,共享所有权
和auto_ptr不同的地方:
1。在内部使用了引用计数share_count,用来表示当前有多少个智能指针对象共享对象指向的内存块
2.析构函数中不失直接释放指针对应的内存块,如果shared_count大于1则不释放内存指是将引用计数减1,指示计数等于1时释放内存
3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将计数加1
网友评论