智能指针(auto_ptr 和 shared_ptr)
2011-06-07 18:18
302 查看
Stl 中 auto_ptr只是众多可能的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
这里是一个简单的代码示例,如果没有auto_ptr,
1
void ProcessAdoption(istream &data)
2
{
3
4
while (data) // 如果还有数据
5
{
6
ALA *pa = readALAData(data); // 取出下一个数据
7
pa->DealProcessAdoption(data); // 处理
8
9
delete pa; // 释放资源
10
}
11
return;
12
}
如果在DealProcessAdoption有一个exception,会发生什么事情,因为ProcessAdoption不能捕获他,所以这段代码很危险,所以DealProcessAdoption后面的代码可能会跳过,造成内存泄露。
如果利用try catch去捕获他,会搞得代码很乱,又缺少美观性。
所以Stl提供了一个智能指针来解决这个问题,我们可以先模拟实现一个智能指针的类实现。
1
// 关于一个智能指针的定义
2
template<typename Type>
3
class auto_ptr
4
{
5
public:
6
auto_ptr(T *p =NULL) :Ptr(p)
7
{ }
8
~auto_ptr()
9
{
10
delete Ptr;
11
}
12
private:
13
Type *Ptr;
14
};
15
16
17
void ProcessAdoption(istream &data)
18
{
19
20
while (data) // 如果还有数据
21
{
22
auto_ptr<ALA> pa(readALADara(data));
23
pa->DealProcessAdoption(data);
24
}
25
return;
26
}
这个版本和原先版本的差异只有二处,
第一pa是一智能指针的对象,不是ALA*
第二不用自己去释放delete
然后我看到Effective STL的条款
8:永不建立auto_ptr的容器
关于此可以看的Effective STL的条款8
因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果
auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char> pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;
然后收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42)); //OK
std::auto_ptr<int> p = new int(42); //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器
然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。
5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。
1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。
关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
1、shared_ptr<T> p(new Y);
要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板
这里是一个简单的代码示例,如果没有auto_ptr,
1
void ProcessAdoption(istream &data)
2
{
3
4
while (data) // 如果还有数据
5
{
6
ALA *pa = readALAData(data); // 取出下一个数据
7
pa->DealProcessAdoption(data); // 处理
8
9
delete pa; // 释放资源
10
}
11
return;
12
}
如果在DealProcessAdoption有一个exception,会发生什么事情,因为ProcessAdoption不能捕获他,所以这段代码很危险,所以DealProcessAdoption后面的代码可能会跳过,造成内存泄露。
如果利用try catch去捕获他,会搞得代码很乱,又缺少美观性。
所以Stl提供了一个智能指针来解决这个问题,我们可以先模拟实现一个智能指针的类实现。
1
// 关于一个智能指针的定义
2
template<typename Type>
3
class auto_ptr
4
{
5
public:
6
auto_ptr(T *p =NULL) :Ptr(p)
7
{ }
8
~auto_ptr()
9
{
10
delete Ptr;
11
}
12
private:
13
Type *Ptr;
14
};
15
16
17
void ProcessAdoption(istream &data)
18
{
19
20
while (data) // 如果还有数据
21
{
22
auto_ptr<ALA> pa(readALADara(data));
23
pa->DealProcessAdoption(data);
24
}
25
return;
26
}
这个版本和原先版本的差异只有二处,
第一pa是一智能指针的对象,不是ALA*
第二不用自己去释放delete
然后我看到Effective STL的条款
8:永不建立auto_ptr的容器
关于此可以看的Effective STL的条款8
因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果
auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char> pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;
然后收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42)); //OK
std::auto_ptr<int> p = new int(42); //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器
然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。
5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。
scoped_ptr | <boost/scoped_ptr.hpp> | 简单的单一对象的唯一所有权。不可拷贝。 |
scoped_array | <boost/scoped_array.hpp> | 简单的数组的唯一所有权。不可拷贝。 |
shared_ptr | <boost/shared_ptr.hpp> | 在多个指针间共享的对象所有权。 |
shared_array | <boost/shared_array.hpp> | 在多个指针间共享的数组所有权。 |
weak_ptr | <boost/weak_ptr.hpp> | 一个属于 shared_ptr 的对象的无所有权的观察者。 |
intrusive_ptr | <boost/intrusive_ptr.hpp> | 带有一个侵入式引用计数的对象的共享所有权。 |
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。
关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
1、shared_ptr<T> p(new Y);
要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板
相关文章推荐
- C++中的智能指针——auto_ptr, unique_ptr, shared_ptr和weak_ptr
- 智能指针auto_ptr & shared_ptr
- 智能指针 std::auto_ptr 和 shared_ptr
- 智能指针——auto_ptr与shared_ptr
- c++智能指针:auto_ptr shared_ptr
- 智能指针 std::auto_ptr 和 shared_ptr
- auto_ptr, unique_ptr, shared_ptr and weak_ptr智能指针讲解
- 智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
- 模拟实现智能指针auto_ptr,scoped_ptr,shared_ptr
- 几种智能指针的比较(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::weak_ptr)
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
- C++智能指针:auto_ptr、shared_ptr、weak_ptr等
- 智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr
- auto_ptr,shared_ptr 智能指针的使用
- c++智能指针:auto_ptr shared_ptr
- C++中的资源管理(一):构造自己的auto_ptr与shared_ptr智能指针
- 智能指针(auto_ptr 和 shared_ptr)
- 浅谈智能指针auto_ptr/shared_ptr/unique_ptr
- 智能指针 std::auto_ptr 和 shared_ptr
- 智能指针(auto_ptr 和 shared_ptr)