文章出處

參考自: http://www.cppblog.com/expter/archive/2009/03/29/78270.html

auto_ptr是什么。

解釋1.auto_ptr是一個管理指針的對象,防止內存泄漏和便于程序員編程時的內存管理
解釋2.auto_ptr所做的事情,就是動態分配對象以及當對象不再需要時自動執行清理。
值得注意的是auto_ptr是一個"對象" 而非指針。

原理(摘自EFFECTIVE C++ 條款13):當把資源放進對象內,當控制流離開函數,對象的析構函數會自動釋放那些資源,
所以實際上是 C++的"析構函數自動調用機制"確保資源被釋放。

auto_ptr的應用地方

取代局部指針變量
類的指針成員變量

總體來說就是防止函數在運行到delete資源之前突然退出,導致沒有把資源delete回收出現的內存泄漏。

用auto_ptr需要引用的頭文件:
#include<memory>


局限性:

1.auto_ptr不能指向數組
2.不要將auto_ptr對象作為STL容器的元素

3.不能通過賦值操作來初始化auto_ptr (會使得原來的指針指向變為NULL)

 1 // 自定義一個仿智能指針
 2 template<typename Type>
 3 class Auto_ptr
 4 {
 5 public:
 6     Auto_ptr(Type *p =NULL) :Ptr(p)
 7     {     }
 8     ~Auto_ptr()
 9     {
10         delete Ptr;
11     }
12     Type* operator ->()
13     {
14         return Ptr;
15     }
16 private:
17     Type *Ptr;
18 };
View Code

可以看出其內部十分簡單,大概原理也就如此 但這個類只適用于操縱類成員或者類函數,操縱普通數據如int float也可以,但不能輸出其值,因為沒有重載<<運算符

使用示例:

Auto_ptr<string> sw(new string("wwss"));
sw->append("ssss");
string q = sw->substr(0,sw->length()-1);
cout<<q<<endl;

再回到stl版本的auto_ptr
一般來說 auto_ptr管理的對象是類的指針成員變量
如class A

A* a = new A();
auto_ptr<A> ss(a);  //這樣把a放進了ss里面管理,之后就可以用ss代替a進行操作。

之后就不用使用delete a釋放內存了。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()