使用auto_ptr需要注意的事项
注:C++11 已不推荐使用,应使用scoped_ptr/shared_ptr. 部分原因就是如下的注意事项。
转自:http://patmusing.blog.163.com/blog/static/13583496020101824541270/
a. auto_ptr定义于头文件memory中;
b. auto_ptr只能用来管理单个动态创建的对象,而不能管理动态创建的数组;
c. 和其他copy和assign不同,auto_ptr的copy和assign会改变右边的操作数,assignment符号的两边的auto_ptr均为左值;There is a crucially important difference between how auto_ptr and built-in pointers treat copy and assignment. When we copy an auto_ptr or assign its value to another auto_ptr, ownership of the underlying object is transferred from the original to the copy. The original auto_ptr is reset to an unbound state;
d. auto_ptr不能作为容器中的元素;
auto_ptr的copy和assign具有析构行为,这就是auto_ptr不能作为容器元素的原因,因为标准库中的容器有对元素的要求:经
过copy或者assign后的两个对象,必须相等;
e. 在判断一个auto_ptr是否被绑定的时候,不能直接使用auto_ptr对象:
auto_ptr<Student> stu1(new Student);
if(stu1)
{
cout << "stu1 is bound" << endl;
}
else
{
cout << "stu1 is unbound" << endl;
}
这样做将会导致compile error,应该改为:
auto_ptr<Student> stu1(new Student);
if(stu1.get()) // get()获取的是underlying对象的指针,如果被绑定则非零,如果没有被绑定则为0
{
cout << "stu1 is bound" << endl;
}
else
{
cout << "stu1 is unbound" << endl;
}
f. auto_ptr的构造函数是explicit的,消除了隐式的类型转换(在这里即,从指针类型到auto_ptr类型的转换),因此不能直接将一个
指针赋给一个auto_ptr对象。如下面这样的代码:
auto_ptr<Student> stu5 = new Student;
stu5->printStudentInfo();
在编译的时候不会有问题,但会出现严重的runtime error。正确的做法应该是:
auto_ptr<Student> stu5(new Student);
stu5->printStudentInfo();
g. 不同用两个auto_ptr绑定到同一个对象。
// stu6和stu7绑定到了同一个对象,这将会导致该对象被析构两次,将会产生runtime error
auto_ptr<Student> stu6(new Student("Evanligine", "F", 8));
auto_ptr<Student> stu7(stu6.get());
后面一句,应该改为:
auto_ptr<Student> stu7(stu6);
这样stu6就将ownership转交给了stu7,stu6则成为了unbound的auto_ptr。
h. 不能用auto_ptr指向静态资源分配对象。如下面的代码,尽管可以通过编译,但将会产生runtime error:
int ix = 10;
auto_ptr<int> pint1(&ix);
i. auto_ptr的重要操作
auto_ptr<T> ap; 创建一个未绑定的auto_ptr对象ap
auto_ptr<T> ap(p); 创建一个auto_ptr对象ap,它绑定了指针p所指向的对象。该构造函数是explicit的
auto_ptr<T> ap1(ap2); 创建一个auto_ptr对象ap1,它绑定到原来被ap2绑定的对象,ap2则成为未绑定的auto_ptr
ap1 = ap2; ap1删除原来绑定的对象,ap2将ownership移交给ap1,ap2成为未绑定的auto_ptr
*ap 返回ap绑定的对象的引用。可以通过*给被绑定的内在对象赋值。如下面代码:
auto_ptr<int> pint(new int(3));
cout << *pint << endl; // 输出3
*pint = 100;
cout << *pint << endl; // 输出100
ap-> 返回被ap绑定的对象的指针
ap.reset(p) 如果指针p和ap绑定的内存对象的指针不相同,那么ap删除被其绑定的内存对象,改而绑定p所
指向的对象.
ap.release() 返回ap所绑定对象的指针,并使ap成为未绑定对象
ap.get() 返回ap所绑定对象的指针
使用auto_ptr需要注意的事项的更多相关文章
- c++ auto_ptr笔记
1.auto_ptr 不可以使用指针惯用的赋值初始化方式,只能直接初始化. 示例: char *p = 'A';//error auto_ptr<char>ptr = new char ...
- auto_ptr,shared_ptr 智能指针的使用
Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...
- c++11 auto_ptr介绍
在代码里面看到了auto_ptr这个东西,正好以前一哥们曾经问过我这个问题..所以特意去搜了搜帖子,学习学习 http://www.cnblogs.com/gaoxianzhi/p/4451803.h ...
- 智能指针auto_ptr & shared_ptr
转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...
- C++ Primer 与“类”有关的注意事项总结
C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...
- C++智能指针 auto_ptr
C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不 ...
- auto_ptr类
auto_ptr是一个模板类,用于管理动态内存分配. 请看下面的函数: void remodel (string& str) { string * ps = new string(str); ...
- shared_ptr 和auto_ptr智能指针
shared_ptr:计数的智能指针 它是一个包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时 ...
- C++智能指针--auto_ptr指针
auto_ptr是C++标准库提供的类模板,头文件<memory>,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个拥有者.当 ...
随机推荐
- Odd number problem
描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中.例如:5 2 81 3 _4 6 7在游戏过程中,可以把空格与其上.下 ...
- lambda 表达式定制操作
泛型算法中的定制操作 许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作. 普通排序算法: template<class RandomItera ...
- PostgreSQL精简命令:
dos命令行连接PostgreSQL: . 接入PostgreSQL数据库: psql -h IP地址 -p 端口 -U 用户名 -d 数据库名 . 输入数据库密码 C:\Users\admin\De ...
- PIE SDK SFIM融合
1.算法功能简介 SFIM 融合方法全称为基于平滑滤波的亮度变换.基本原理是将高分辨率影像通过低通滤波抑制其高频空间信息保留低频信息,再将原高分辨率影像与通过低通滤波的高分辨率影像进行比值运算,以抵消 ...
- 第二次 Scrum Meeting
第二次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/4 19:00 20min 微信群 附Github仓库:WEDO 例会照片 清明假期期间 线上小组例会 工作情 ...
- [V1-Team] WEDO创意论坛功能规格说明书
项目功能规格说明书 版本说明 版本 内容 时间 V1.0 描述总体目标,用户使用场景,界面原型.功能设计及验收 2019.3.28 附Github仓库:WEDO 正文 1.目标 规范指导整个项目设计与 ...
- Git merge 和 rebase 进一步比较
但是 假如 我不想看到 分支转折点呢 合并的分支始终会存在一个交叉点 Microsoft Windows [版本 10.0.17134.345] (c) Microsoft Corporation.保 ...
- 实现Docker跨主机间的容器网络联通
Server1(Server) 192.168.81.58 内核版本 3.10.0-123.el7.x86_64 Docker版本 1.12.6Server2(Agent) 192.168.81.5 ...
- (转)python strip()函数 去空格\n\r\t函数的用法
原文:http://www.cnblogs.com/zdz8207/p/python_learn_note_20.html python3.4学习笔记(二十) python strip()函数 去空格 ...
- springsource-tool-suite下载(sts)
1 新版本的插件下载 1 直接进入官网下载即可 官网地址:http://spring.io/tools/sts/all. 2 spring官网上下载历史版本的spring插件 1 获取新版本的插件的地 ...