智能指针

1 定义 auto_ptr< 类型 > 指针变量名   动态分配对象以及当对象不再使用时自动清理
把指针封装在一个“智能的”类似指针的对象里,这个对象拥有这个指针并且能在析构时自动删除这个指针指的对象,因为这个智能指针可以简单的当成一个自动的对象(这就是说,它除了作用域后会自动毁灭)所以称之为智能指针;
2 将所有权传给一个 auto_ptr 对象   auto_ptr<T>ptr2(ptr1);
   使用 auto_ptr 就像我们以前使用简单指针一样    *ptr2 = 12;
   get() 来获得指针的值            assert(ptr1 == ptr2.get());
   release() 来撤销所有权           T*  ptr3 = ptr2.release();
   自己删除这个对象 Ptr3 不要删除 ptr2 因为它不再拥有任何指针。
   最后,我们可以使用 auto_ptr reset() 函数来重置 auto_ptr 使之拥有另一个对象。如果这个 auto_ptr 已经拥有了一个对象,那么,它会先删除已经拥有的对象,因此调用 reset() 就如同销毁这个 auto_ptr ,然后新建一个并拥有一个新对象。
3 使用 reset()
例如: auto_ptr<T>pt(new T(1));        pt.reset(new T(2));// 删除由“ new T(1) ”分配出来的第一个 T    最后出了作用域后 第二个 T 也被删除了!
 
用法:
1、  需要包含头文件 <memory>
2、  Constructor:explicit auto_ptr(X* p=0) throw(); 将指针 P 交给 auto_ptr 对象托管
3 Copy constructor: auto_ptr(const auto_ptr&) throw(); template<class Y> auto_ptr(const auto_ptr<Y>& a) throw(); 指针的托管权会发生转移
4、  Destructor: ~auto_ptr(); 释放指针 p 指向的空间
5 、提供了两个成员函数 X* get() const throw();// 返回保存的指针,对象中仍保留指针 X* release() const throw();// 返回保存的指针,对象中不保留指针
auto_ptr 实现关键点
1. 利用特点“栈上对象在离开作用范围时会自动析构”
2. 对于动态分配的内存,其作用范围是程序员手动控制的,这给程序员带来了方便但也不可避免疏忽造成的内存泄漏,毕竟只有编译器是最可靠的。
3.auto_ptr 通过在栈上构建一个对象 a ,对象 a wrap 了动态分配内存的指针 p ,所有对指针 p 的操作都转为对对象 a 的操作。而在 a 的析构函数中会自动释放 p 的空间,而该析构函数是编译器自动调用的,无需程序员操心。
注意:
但是要注意使用中的一个陷阱 , 那就是指针的托管权是会转移的。 例如在上例中,如果 auto_ptr<TC> pTC(new TC);   auto_ptr<TC> pTC1=pTC; 那么 ,pTC1 将拥有该指针,而 pTC 没有了,如果再用 pTC 去引用,必然导致内存错误。
要避免这个问题,可以考虑使用采用了引用计数的智能指针,例如 boost::shared_ptr
auto_ptr 不会降低程序的效率,但 auto_ptr 不适用于数组, auto_ptr 根本不可以大规模使用。 shared_ptr 也要配合 weaked_ptr ,否则会很容易触发循环引用而永远无法回收内存。理论上,合理使用容器加智能指针, C++ 可以完全避免内存泄露,效率只有微不足道的下降 ( 中型以上程序最多百分之一 )
 

你可能感兴趣的:(C++,指针,休闲,auto_ptr)