[C++标准模板库:自修教程与参考手册]关于auto_ptr
来源:互联网 发布:南京信讯通软件 编辑:程序博客网 时间:2024/05/21 22:46
什么是auto_ptr指针
auto_ptr是这样一种指针:它是“它所指的对象”的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要求一个对象只能拥有一个拥有者,严禁一物二主。
注意:auto指针不能用一般指针惯用的赋值初始化方式,必须直接使用数值来完成初始化。
std::auto_ptr<ClassA> ptr1(new ClassA);//这是正确的std::auto_ptr(ClassA) ptr2=new ClassA;//这是错误的
关于拥有权的转移
//创建一个auto_ptr,指向A类std::auto_ptr<ClassA> ptr1(new ClassA);//将所有权转移给ptr2std::auto_ptr<ClassA> ptr2(ptr1);
在第一个语句中,ptr1拥有那个new出来的对象,在第二个语句中由ptr1转交给ptr2。此后ptr2就拥有了那个被new出来的对象,而ptr1就不再拥有它。这样,对象就只会被摧毁一词——就是在ptr2被销毁的时候。如果ptr2在被赋值前拥有另一个对象,那么会先调用该对象的delete,将这个对象删除。(在拥有权转移后,指针ptr1就变成了一个null指针)
起点和终点
拥有权的转移,使得auto_ptr产生了特殊的用法:某个函数可以利用auto_ptr将拥有权转交给另一个函数,这种事情可能发生在两种情况下:
- 某函数是数据的终点。如果auto_ptr以by value的方式当做一个参数传递给某个函数,就是这种情况。此时被调用端的参数获得了这个auto_ptr的拥有权,如果该函数不将它传递出去,它所指的对象就会在函数退出时被删除。
void sink(std::auto_ptr<ClassA>);
- 某函数时数据的起点。当一个auto_ptr被返回,其所有权便被转交给调用端了:
std::auto_ptr<ClassA> f(){ std::auto_ptr<ClassA> ptr(new ClassA); .... return ptr;}void g(){std::auto_ptr<ClassA> p;for(int i=0;i<n;i++){ p=f(); }}
每当f()被调用,它都new一个新对象,然后把该对象连同其拥有权一起返回给调用端。将返回值赋值给p,同时也完成了所有权的转移,p原来指向的对象会被销毁,离开g()时,p也会被删除。
缺陷
auto_ptr的语义本身就包含了拥有权,所以如果你无意交出你的拥有权,就不要再参数列表中使用auto_ptr,也不要以它为返回值,比如下面这个例子就是错误的:
void print(std::auto_ptr<T>p){ if(p.get()==null) std::<<"null"; else std::cout<<*p;}
只要有一个auto_ptr被当做参数,它所拥有的对象在这个函数退出时候都会被删除,这可能不是你想要的结果。
你可能会认为,将auto_ptr以pass by reference传递就万事大吉。然而这种行为会使“拥有权”的概念变得难以捉摸。因为面对一个“透过reference而获得auto_ptr”的函数,你根本无法知道它的所有权是否已经给出,所以这种情况应该全力避免。
不过,我们可以使用const reference,向函数传递拥有权,比如这样:
const std::auto_ptr<ClassA> ptr(new ClassA);*p=2;print(p);
这样的方案使得auto_ptr比以前显得更加安全些。很多接口在需要内部拷贝时,都通过constant reference来获得原值。关键字constant并不意味着你不能改变auto_ptr所拥有的对象,而是说你不能改变对象的所有权。
auto_ptr需要注意的地方
- auto_ptrs之间不能共享拥有权
我觉得这一条应该不用解释了。 - 并不存在针对array而设计的auto_ptrs
auto_ptr不可以指向array,因为auto_ptr使用的是delete而不是
delete[]来释放其所拥有的对象。
- [C++标准模板库:自修教程与参考手册]关于auto_ptr
- [C++标准模板库:自修教程与参考手册]关于vector
- [C++标准模板库:自修教程与参考手册]关于deque
- C++标准模板库中的auto_ptr
- C++标准模板库中的auto_ptr
- C++标准模板库中的auto_ptr
- C++标准库—自学教程与参考手册(第2版)之第一章 关于这本书
- 标准模板库STL中Stack参考手册
- 标准模板库STL中Queue参考手册
- C++标准库—自学教程与参考手册(第2版)翻译前言
- 标准模板库STL中vector使用参考手册
- 标准模板库STL中List使用参考手册
- 模板与标准模板库
- JSTL标准模板库教程
- STL标准程序库第一部分总结(Auto_ptr&&numeric_limits,标准模板库,迭代器的配接器)
- C++ 参考手册 标准库
- C++:标准模板库(STL)
- C++:标准模板库vector
- nginx.conf配置整理
- POJ_2115_C Looooops
- poj 3616 Milking Time
- 报数出队,输入n与m,找到最后一个人
- sudo apt-get update出错!
- [C++标准模板库:自修教程与参考手册]关于auto_ptr
- Linux 进程调度浅析
- 实训--day10
- Linux内核工程导论——linux学习和职业曲线(初学者,中级,高级都可参考)
- BeautifulSoup学习之CSS选择器
- js技术--正则表达式
- httpclient
- springmvc标签<mvc:annotation-driven/>(十二)
- hibernate异常 Session was already closed