auto_ptr浅析
来源:互联网 发布:集成吊顶算法 编辑:程序博客网 时间:2024/06/06 23:59
auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)
auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。
std::auto_ptr<ClassA> pa(new ClassA);
下面主要分析一下auto_ptr的几个要注意的地方:
1,Transfer of Ownership
auto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,在给其他auto_ptr赋值的时候,会转移这种拥有关系。
01
#include <utility>
02
#include <iostream>
03
using
namespace
std;
04
05
class
A
06
{
07
public
:
08
A() { id = ++count; cout <<
"create A"
<< id <<
"/n"
; }
09
~A() { cout <<
"destroy A"
<< id <<
"/n"
; }
10
private
:
11
static
int
count;
12
int
id;
13
};
14
15
int
A::count = 0;
16
17
/*调用该函数会丢失掉所有权*/
18
void
sink(auto_ptr<A> a)
19
{
20
cout <<
"Enter sink()/n"
;
21
}
22
23
/*调用该函数会创建对象,并获取所有权*/
24
auto_ptr<A> create()
25
{
26
cout <<
"Enter create()/n"
;
27
auto_ptr<A> a(
new
A());
28
return
a;
29
}
30
31
int
main(
int
argc,
char
*argv[])
32
{
33
auto_ptr<A> a1 = create();
34
auto_ptr<A> a2 = a1;
/*转移所有权,此时a1无效了*/
35
auto_ptr<A> a3(
new
A());
36
cout <<
"Exit create()/n"
;
37
sink(a2);
/*丢失所有权,会发现a2的释放在sink函数中进行*/
38
cout <<
"Exit sink()/n"
;
39
return
0;
40
}
41
42
输出结果是:
Enter create()
create A1
createA2
Exit create()<br>Enter sink()<br>destroyA1<br>Exit sink()<br>destroy A2<br><br>
2,从上可知由于在赋值,参数传递的时候会转移所有权,因此不要轻易进行此类操作。
比如:std::auto_ptr<ClassA> pa(new ClassA());
bad_print(pa); //丢失了所有权
pa->...; //Error
3,使用auto_ptr作为成员变量,以避免资源泄漏。
为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。
比如,如果该类有2个成员变量,指向两个资源,在构造函数中申请资源A成功,但申请资源B失败,则构造函数失败,那么析构函数不会被调用,那么资源A则泄漏。
为了解决这个问题,我们可以利用auto_ptr取代普通指针作为成员变量,这样首先调用成功的成员变量的构造函数肯定会调用其析构函数,那么就可以避免资源泄漏问题。
4,不要误用auto_ptr
1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。
2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。
3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。
4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr浅析
- auto_ptr 浅析(转)
- auto_ptr用法浅析
- auto_ptr:
- Auto_ptr
- auto_ptr
- auto_ptr
- auto_ptr
- auto_ptr
- auto_ptr
- auto_ptr
- 在没有.net环境的机子上运行C#程序——方法一
- 学习比较Struts2和Struts1的区别
- 总线架构性能评估--ARM的解决之道
- BREW上构建小型WINDOW机制
- 基于μC/OS-Ⅱ的线控转向FlexRay通信控制
- auto_ptr浅析
- VS2010中不可忽视的部分——VSTO
- 在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
- Java中的ASCII、Unicode和UTF-8字符编码集
- 解析域名与IP地址(Linux编程)
- HTTP引擎
- MSDN for VC 6.0
- 使用Quartz 定时生成话单、把话单上传FTP、把话单移动到备份目录
- ibatis批量处理+多表关联查询