C++智能指针
来源:互联网 发布:网络影视发行 编辑:程序博客网 时间:2024/05/01 14:56
三个智能指针模板都定义了类似于指针的对象,可以将new获得的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给这些对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存的释放是自动的。
1. auto_ptr(C++98)
2. unique_ptr (C++11)
3. shared_ptr
- 智能指针与常规指针:
常规指针:
void demo1(){ double * pd=new double;//#1 *pd=25.5; //#2 return;??#3}//说明://#1. 为pd和一个double值分配存储空间,保存地址;//#2. 将值复制到动态内存中//#3. 删除pd,值被保留在动态内存中
智能指针:
void demo2(){ auto_ptr<double> ap(new double);//#1 *ap=25.5;//#2 return;//#3}//说明://#1. 为ap和一个double值分配存储空间,保存地址;//#2. 将值复制到动态内存中//#3. 删除ap,ap的析构函数释放内存
使用只能指针要包含头文件memory,其他两种智能指针定义:
#include <memory>...unique_ptr<double> pdu(new double);shared_ptr<string> pss(new string);
//全部三种智能指针都应避免一点:
string v("hello_pc");shared_ptr<string> pv(&v);//No!!!
因为pv过期时,程序将delete运算符用于非堆内存。
- 为何有三种智能指针?
auto_ptr<string> ps(new string("T ans"));auro_ptr<string> va;va=ps;
上述复制语句,如果两个指针都是常规的,指向同一对象。它会出现问题,因为程序试图删除一个对象两次,一次在ps过期的时候,一次在va过期的时候。
- 解决方法:
- 定义赋值运算符,两个指针指向不同的对象,一个是另一个的副本
- 建立所有权概念,对于特定对象,只有一个智能指针可拥有它,只有拥有对象的智能指针的构造函数会删除对象。然后,让赋值操作转让所有权。auto_ptr和unique_ptr的策略,后者更严格。
引用计数,赋值时,计数加1,而指针过期时,计数减1。仅当最后一个指针过期时,才用delete。shared_ptr的策略。
unique_ptr为何优于auto_ptr
auto_ptr<string> p1(new string("auto"));auto_ptr<string> p2;p2=p1;//#3
在语句#3,p2接管string对象的所有权后,p1的所有权被剥夺。但如果后续程序要用到p1, p1不再指向有效数据,这是个坏事。
unique_ptr<string> p1(new string("auto"));unique_ptr<string> p2;p2=p1;//#3
用unique_ptr指针,编译器认为#3非法,避免了p3不再指向有效的数据。
另外:auto_ptr使用delete而不是delete[],只能与new一起使用。
unique_ptr有使用new[]和delete[]的版本.
unique_ptr < double []> pda(new double(5));
智能指针的选择
如果程序要使用多个指向同一对象的指针,应选择shared_ptr。
如果不需要使用多个指向同一对象的指针,可使用unique_ptr。在满足unique_ptr的条件时,也可用auto_ptr,但unique_ptr更好。警告:
使用new分配内存时,才能使用auto_ptr和shared_ptr,使用new[]时,不能使用它们。
- c++:智能指针
- C++:智能指针
- 【C++】智能指针
- 【C++】智能指针
- C++PJ智能指针
- 【c++】智能指针
- 【C++】智能指针auto_ptr
- C++,智能指针
- C++,boost智能指针
- 智能指针模拟C
- [C++]智能指针
- 【C++】 浅析智能指针
- C++_智能指针
- C++:初识智能指针
- C++::智能指针
- 【C++】智能指针
- c智能指针:unique_ptr
- 【C++】智能指针
- (五)java开发常用类(包装,数字处理集合等)(下)
- 关于cp命令中拷贝所有的写法
- Android 使用socket实现两个真机之间的通信
- 开发实用整理
- 我的ffmpeg学习之路-源码编译
- C++智能指针
- 十大实用的开源电子商务工具推荐
- 循环有序数组/旋转数组的二分查找
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Android学习——MultiAutoCompleteTextView组件
- Android学习网站
- hdu2987 map
- linux+php+mysql环境搭建
- 很全的正则验证方法