亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中的auto_ptr智能指針的作用及使用方法詳解

2020-01-26 14:31:03
字體:
來源:轉載
供稿:網友

智能指針(auto_ptr) 這個名字聽起來很酷是不是?其實auto_ptr 只是C++標準庫提供的一個類模板,它與傳統的new/delete控制內存相比有一定優勢,但也有其局限。本文總結的8個問題足以涵蓋auto_ptr的大部分內容。

 auto_ptr是什么?

auto_ptr 是C++標準庫提供的類模板,auto_ptr對象通過初始化指向由new創建的動態內存,它是這塊內存的擁有者,一塊內存不能同時被分給兩個擁有者。當auto_ptr對象生命周期結束時,其析構函數會將auto_ptr對象擁有的動態內存自動釋放。即使發生異常,通過異常的棧展開過程也能將動態內存釋放。auto_ptr不支持new 數組。

該類型在頭文件memory中,在程序的開通通過 #include<memory> 導入,接下來講解該智能指針的作用和使用。

使用方法:

  auto_ptr<type> ptr(new type()); 這是該指針的定義形式,其中 type 是指針指向的類型,ptr 是該指針的名稱。

  比如該type 是int,具體定義如下:

  auto_ptr<int> ptr(new int(4));

  比如該type 是map<int,vector<int> >,具體定義如下:

  auto_ptr<map<int,vector<int> > > ptr(new map<int,vector<int> > ());

  當然可以先定義,后賦值,如下所示:

  auto_ptr<map<int,int> > ptr;
  ptr = auto_ptr<map<int,int> >(new map<int,int> ());

作用1:保證一個對象在某個時間只能被一個該種類型的智能指針所指向,就是通常所說的對象所有權。

作用2:對指向的對象自動釋放的作用,詳情看如下代碼。

代碼片段一:

#include <iostream>#include <string.h>#include <memory>#include <string>#include <Windows.h>#include <map>#include <ctime>#include <vector>using namespace std;#define MAXN 20000000class test_ptr{public:map<int,int> *p;test_ptr(){p = new map<int,int>();for(int i = 0;i<MAXN;i++)p->insert(make_pair(i,i));}};int main(int argc,char *argv[]){for(int i = 0;i<100;i++){Sleep(1000);cout << i << endl; // 輸出 創建次數test_ptr * tmp = new test_ptr();}system("pause");return 0;} 


在某些情況下,可能我們就會寫出上面的代碼來,通過運行會發現存在內存溢出。對于一些經驗老道的程序員可能會作如下改寫:

代碼片段二:

#include <iostream>#include <string.h>#include <memory>#include <string>#include <Windows.h>#include <map>#include <ctime>#include <vector>using namespace std;#define MAXN 20000000class test_ptr{public:map<int,int> *p;test_ptr(){//p = auto_ptr<map<int,int> > (new map<int,int>());p = new map<int,int>();for(int i = 0;i<MAXN;i++)p->insert(make_pair(i,i));}~test_ptr(){delete p;}};int main(int argc,char *argv[]){for(int i = 0;i<100;i++){Sleep(1000);cout << i << endl; test_ptr * tmp = new test_ptr();}system("pause");return 0;} 

在test_ptr 類中的析構函數中添加內存釋放代碼,但是在main函數中,定義的局部指針,當局部指針失效時并不會自動調用析構函數,在這種情況下也會導致內存泄漏問題。當然,如果細心的程序員可以在 test_ptr * tmp = new test_ptr() 后面加上一句 delete tmp ,這樣也能夠釋放內存,不會出現內存泄漏問題。但是在某些情況下,很容易漏寫,為了解決此問題,auto_ptr 就能發揮作用了。

代碼片段三:

#include <iostream>#include <string.h>#include <memory>#include <string>#include <Windows.h>#include <map>#include <ctime>#include <vector>using namespace std;#define MAXN 20000000class test_ptr{public:map<int,int> *p;test_ptr(){p = new map<int,int>();for(int i = 0;i<MAXN;i++)p->insert(make_pair(i,i));}~test_ptr(){delete p;}};int main(int argc,char *argv[]){for(int i = 0;i<100;i++){Sleep(1000);cout << i << endl; //輸出創建次數auto_ptr<test_ptr> tmp = auto_ptr<test_ptr> (new test_ptr());}system("pause");return 0;} 

在main函數中,創建test_ptr類型指針時,該指針是auto_ptr 類型的智能指針,當智能指針失效時,會自動調用該類的析構函數。所以這種寫法可以不再顯示調用delete 語句了。但是該智能指針也只是保證調用類的析構函數,如果析構函數并沒有釋放類中聲明的變量,那該怎么辦。

代碼片段四:

#include <iostream>#include <string.h>#include <memory>#include <string>#include <Windows.h>#include <map>#include <ctime>#include <vector>using namespace std;#define MAXN 20000000class test_ptr{public://auto_ptr<map<int,int> > p;map<int,int> *p;test_ptr(){//p = auto_ptr<map<int,int> > (new map<int,int>());p = new map<int,int>();for(int i = 0;i<MAXN;i++)p->insert(make_pair(i,i));}/*~test_ptr(){delete p;}*/};int main(int argc,char *argv[]){for(int i = 0;i<100;i++){Sleep(1000);cout << i << endl; //輸出創建次數auto_ptr<test_ptr> tmp = auto_ptr<test_ptr> (new test_ptr());}system("pause");return 0;}

在這種情況下,還是會出現內存泄漏問題,為了解決該問題,對類中聲明的指針也是需要聲明為auto_ptr類型。

代碼片段五:

#include <iostream>#include <string.h>#include <memory>#include <string>#include <Windows.h>#include <map>#include <ctime>#include <vector>using namespace std;#define MAXN 20000000class test_ptr{public:auto_ptr<map<int,int> > p;test_ptr(){p = auto_ptr<map<int,int> > (new map<int,int>());for(int i = 0;i<MAXN;i++)p->insert(make_pair(i,i));}};int main(int argc,char *argv[]){for(int i = 0;i<100;i++){Sleep(1000);cout << i << endl; //輸出創建次數auto_ptr<test_ptr> tmp = auto_ptr<test_ptr> (new test_ptr());}system("pause");return 0;}

這樣就不用顯示定義類的析構函數,不用在外部顯示調用delete函數,當然如果盡早調用delete函數也是可以的,盡早釋放內存也比該指針失效再釋放好一些,這些就是為了防止忘記調用。

通過如上分析:可以得出如下結論。

1 定義了智能指針,當智能指針失效時會自動調用類的析構函數。

2 在 類中定義的智能指針,不必在析構函數中顯示的delete,當外部調用該類的析構函數時,會自動釋放該智能指針指向的對象,釋放內存。

3 如果類中定義的是智能指針,但是外部沒有觸發類中的析構函數調用,該智能指針指向的對象還是不能釋放。

auto_ptr 智能指針的bug

auto_ptr 智能指針在c++ 11 標準中已經被拋棄,被拋棄的原因就是因為該bug。前面也提到過,一個對象只能被一個智能指針所引用,這樣就會導致一個賦值問題??慈缦麓a

代碼片段六:

#include <iostream>#include <string.h>#include <memory>#include <set>using namespace std;#define MAXN 20000000void pri(auto_ptr<set<int> > p){set<int>::iterator ite = p->begin();for(;ite!=p->end();ite++){cout << *ite << endl;}}int main(int argc,char *argv[]){auto_ptr<set<int> > ptr(new set<int> ());for(int i = 0;i< 3;i++){int a;cin >> a;ptr->insert(a);}pri(ptr);pri(ptr);system("pause");return 0;}

初看這代碼沒什么問題,不過運行程序會崩潰。這就是該智能指針最大的bug, 在程序32行 調用pri(ptr) ,程序到這并沒什么問題,但是第二次調用pri(ptr) 時程序就會崩潰。原因就是前面講過,一個對象智能被一個智能指針所指向,在第一次調用pri()函數時,為了保證這一原則,當把ptr指針傳入pri函數時,程序內部就把ptr置為空,所以到第二次調用時,就會出現崩潰的情況。對于這種情況的解決之道就是使用shared_ptr 指針(該指針的原理是通過引用計數器來實現的)。

如果要使用shared_ptr 智能指針,需要安裝boost庫,該庫還包括許多其他功能。有興趣的可以嘗試以下,該類中的智能指針還是比較好用。也不存在很多其他bug。

以上所述是小編給大家介紹的C++中的auto_ptr智能指針實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲的天堂在线中文字幕| 日韩女在线观看| 久久九九热免费视频| 国产精品扒开腿做| 91成人在线视频| 久久精品国产一区| 97婷婷大伊香蕉精品视频| 久久69精品久久久久久国产越南| 亚洲欧洲一区二区三区久久| 欧美一乱一性一交一视频| 国产91精品黑色丝袜高跟鞋| 日韩电影免费观看在线观看| 欧美亚洲另类激情另类| 欧美性xxxxx| 91国内产香蕉| 久久精品这里热有精品| 2019中文在线观看| 欧美日韩中国免费专区在线看| 午夜精品久久久99热福利| 亚洲综合色av| 欧美极品少妇xxxxx| 亚洲福利视频网| 欧美激情一级二级| 国产精品久久久久久久久久久新郎| 亚洲精品白浆高清久久久久久| 日本精品久久久久久久| 这里只有精品视频| 国产一区二区三区在线播放免费观看| 欧美成人一区在线| 在线看日韩av| 国产亚洲欧美日韩一区二区| 欧美激情网友自拍| 久久久精品在线观看| 日韩中文有码在线视频| 欧美诱惑福利视频| 亚洲第一av网站| 影音先锋日韩有码| 欧美在线免费观看| 亚洲精品国产精品久久清纯直播| 亚洲精品国产品国语在线| zzjj国产精品一区二区| 欧美日韩另类在线| 日韩av在线网站| 中文字幕综合在线| 欧美影院在线播放| 亚洲欧美日韩中文在线| 亚洲视频一区二区三区| 国产精品视频不卡| 国产性猛交xxxx免费看久久| 亚洲影院色无极综合| 日韩在线中文字| 日韩欧美中文在线| 久久av.com| 中文字幕少妇一区二区三区| 欧美日韩在线视频一区| 欧美日韩视频在线| 欧美视频不卡中文| 97婷婷大伊香蕉精品视频| 91精品久久久久久久久青青| 国产精品视频久久| 国产精品va在线播放| 国产91精品在线播放| 97国产一区二区精品久久呦| 欧美精品18videosex性欧美| 国产91精品久久久久久| **欧美日韩vr在线| xxav国产精品美女主播| 亚洲国产成人精品女人久久久| 精品中文字幕在线2019| 亚洲国产日韩精品在线| 国产欧美日韩中文字幕在线| 国产精品h片在线播放| 成人a在线视频| 国产精品91久久久| 91精品一区二区| 日本韩国欧美精品大片卡二| 国产精品激情av电影在线观看| 亚洲天堂成人在线| 欧美极品少妇xxxxⅹ喷水| 亚洲精品国产suv| 亚洲欧美一区二区三区四区| 国产日韩精品综合网站| 久久中文字幕在线| 日韩欧美在线播放| 精品久久久久久中文字幕大豆网| 91高清视频在线免费观看| www国产精品视频| 久久久久国色av免费观看性色| 亚洲精品久久久久久久久| 亚洲欧美国产视频| 欧美精品亚州精品| 亚洲最大的成人网| 欧美国产在线电影| 97激碰免费视频| 欧美国产日韩二区| 成人免费视频xnxx.com| 91免费综合在线| 深夜福利一区二区| 亚洲天堂开心观看| 国产亚洲成精品久久| 欧美国产第二页| 欧美一区二区大胆人体摄影专业网站| 久久欧美在线电影| 亚洲淫片在线视频| 国产亚洲综合久久| 久久成人av网站| 日韩精品在线免费播放| 日韩中文字幕精品| 欧洲亚洲妇女av| 国产91成人在在线播放| 日韩av片永久免费网站| 国产精品久久久久久超碰| 亚洲伊人久久大香线蕉av| 久久久久国色av免费观看性色| 亚洲第一精品福利| 91九色国产社区在线观看| 亚洲欧美中文日韩在线v日本| 91精品国产综合久久久久久蜜臀| 国产精品揄拍一区二区| 国产美女高潮久久白浆| 久久免费观看视频| 欧美寡妇偷汉性猛交| 亚洲小视频在线观看| 亚洲色图综合网| 亚洲一区亚洲二区亚洲三区| 深夜福利91大全| 亚洲第一在线视频| 国产不卡在线观看| 日本欧美爱爱爱| 欧美理论电影在线观看| 最近2019中文字幕大全第二页| 亚洲精品一区二区三区婷婷月| 亚洲va欧美va国产综合剧情| 亚洲精品自拍视频| 尤物九九久久国产精品的分类| 日韩小视频在线| 亚洲区一区二区| 国产成人午夜视频网址| 欧美尺度大的性做爰视频| 亚洲欧洲日产国码av系列天堂| 日韩在线免费高清视频| 日韩av成人在线| 91亚洲国产精品| 亚洲成人av在线| 日韩精品免费一线在线观看| 亚洲第一精品夜夜躁人人躁| 91av在线看| 日本国产欧美一区二区三区| 久久亚洲精品小早川怜子66| 成人免费福利视频| 爱福利视频一区| 人人澡人人澡人人看欧美| 啊v视频在线一区二区三区| 国产日韩精品在线| 色琪琪综合男人的天堂aⅴ视频| 91亚洲精品久久久久久久久久久久| 韩日精品中文字幕| 欧美精品www| 久久香蕉国产线看观看av| 亚洲精品日韩丝袜精品| 欧美激情国内偷拍| 国产精品久久国产精品99gif| 欧美精品一区二区三区国产精品| 精品福利樱桃av导航|