一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

智能指針

 mrjbydd 2012-09-10

智能指針(auto_ptr) 這個(gè)名字聽(tīng)起來(lái)很酷是不是?其實(shí)auto_ptr 只C++標(biāo)準(zhǔn)庫(kù)提供的一個(gè)類模板,它與傳統(tǒng)的new/delete控制內(nèi)存相比有一定優(yōu)勢(shì),但也有其局限。本文總結(jié)的8個(gè)問(wèn)題足以涵蓋auto_ptr的大部分內(nèi)容。

 

1. auto_ptr是什么?

auto_ptr 是C++標(biāo)準(zhǔn)庫(kù)提供的類模板,auto_ptr對(duì)象通過(guò)初始化指向由new創(chuàng)建的動(dòng)態(tài)內(nèi)存,它是這塊內(nèi)存的擁有者,一塊內(nèi)存不能同時(shí)被分給兩個(gè)擁有者。當(dāng) auto_ptr對(duì)象生命周期結(jié)束時(shí),其析構(gòu)函數(shù)會(huì)將auto_ptr對(duì)象擁有的動(dòng)態(tài)內(nèi)存自動(dòng)釋放。即使發(fā)生異常,通過(guò)異常的棧展開(kāi)過(guò)程也能將動(dòng)態(tài)內(nèi)存釋 放。auto_ptr不支持new 數(shù)組。

 

2. auto_ptr需要包含的頭文件?

#include <memory>

 

3. 初始化auto_ptr對(duì)象的方法?

1) 構(gòu)造函數(shù)

1] 將已存在的指向動(dòng)態(tài)內(nèi)存的普通指針作為參數(shù)來(lái)構(gòu)造

int* p = new int(33);

auto_ptr<int> api(p);

2] 直接構(gòu)造智能指針

auto_ptr< int > api( new int( 33 ) );

2) 拷貝構(gòu)造

利用已經(jīng)存在的智能指針來(lái)構(gòu)造新的智能指針

auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );

auto_ptr< string > pstr_auto2( pstr_auto );  //利用pstr_auto來(lái)構(gòu)造pstr_auto2

因?yàn)橐粔K動(dòng)態(tài)內(nèi)存智能由一個(gè)智能指針獨(dú)享,所以在拷貝構(gòu)造或賦值時(shí)都會(huì)發(fā)生擁有權(quán)轉(zhuǎn)移的過(guò)程。在此拷貝構(gòu)造過(guò)程中,pstr_auto將失去對(duì)字符串內(nèi)存的所有權(quán),而pstr_auto2將其獲得。對(duì)象銷毀時(shí),pstr_auto2負(fù)責(zé)內(nèi)存的自動(dòng)銷毀。

3) 賦值

利用已經(jīng)存在的智能指針來(lái)構(gòu)造新的智能指針

auto_ptr< int > p1( new int( 1024 ) );

auto_ptr< int > p2( new int( 2048 ) );

p1 = p2;

在賦值之前,由p1 指向的對(duì)象被刪除。賦值之后,p1 擁有int 型對(duì)象的所有權(quán)。該對(duì)象值為2048。 p2 不再被用來(lái)指向該對(duì)象。

 

4. 空的auto_ptr 需要初始化嗎?

通常的指針在定義的時(shí)候若不指向任何對(duì)象,我們用Null給其賦值。對(duì)于智能指針,因?yàn)闃?gòu)造函數(shù)有默認(rèn)值0,我們可以直接定義空的auto_ptr如下:

auto_ptr< int > p_auto_int;  //不指向任何對(duì)象

 

5. 防止兩個(gè)auto_ptr對(duì)象擁有同一個(gè)對(duì)象(一塊內(nèi)存)

因?yàn)閍uto_ptr的所有權(quán)獨(dú)有,所以下面的代碼會(huì)造成混亂。

int* p = new int(0);
auto_ptr<int> ap1(p);
auto_ptr<int> ap2(p);

因?yàn)閍p1與ap2都認(rèn)為指針p是歸它管的,在析構(gòu)時(shí)都試圖刪除p, 兩次刪除同一個(gè)對(duì)象的行為在C++標(biāo)準(zhǔn)中是未定義的。所以我們必須防止這樣使用auto_ptr。

 

6. 警惕智能指針作為參數(shù)!

1) 按值傳遞時(shí),函數(shù)調(diào)用過(guò)程中在函數(shù)的作用域中會(huì)產(chǎn)生一個(gè)局部對(duì)象來(lái)接收傳入的auto_ptr(拷貝構(gòu)造),這樣,傳入的實(shí)參auto_ptr就失去了其對(duì)原對(duì)象的所有權(quán),而該對(duì)象會(huì)在函數(shù)退出時(shí)被局部auto_ptr刪除。如下例:

void f(auto_ptr<int> ap)

{cout<<*ap;}
auto_ptr<int> ap1(new int(0));
f(ap1);
cout<<*ap1; //錯(cuò)誤,經(jīng)過(guò)f(ap1)函數(shù)調(diào)用,ap1已經(jīng)不再擁有任何對(duì)象了。

2) 引用或指針時(shí),不會(huì)存在上面的拷貝過(guò)程。但我們并不知道在函數(shù)中對(duì)傳入的auto_ptr做了什么,如果當(dāng)中某些操作使其失去了對(duì)對(duì)象的所有權(quán),那么這還是可能會(huì)導(dǎo)致致命的執(zhí)行期錯(cuò)誤。

結(jié)論:const reference是智能指針作為參數(shù)傳遞的底線。

 

7. auto_ptr不能初始化為指向非動(dòng)態(tài)內(nèi)存

原因很簡(jiǎn)單,delete 表達(dá)式會(huì)被應(yīng)用在不是動(dòng)態(tài)分配的指針上這將導(dǎo)致未定義的程序行為。

 

8. auto_ptr常用的成員函數(shù)

1) get()

返回auto_ptr指向的那個(gè)對(duì)象的內(nèi)存地址。如下例:

int* p = new int(33);

cout << "the adress of p: "<< p << endl;

auto_ptr<int> ap1(p);

cout << "the adress of ap1: " << &ap1 << endl;

cout << "the adress of the object which ap1 point to: " << ap1.get() << endl;

輸出如下:

the adress of p: 00481E00

the adress of ap1: 0012FF68

the adress of the object which ap1 point to: 00481E00

第一行與第三行相同,都是int所在的那塊內(nèi)存的地址。第二行是ap1這個(gè)類對(duì)象本身所在內(nèi)存的地址。

2) reset()

重新設(shè)置auto_ptr指向的對(duì)象。類似于賦值操作,但賦值操作不允許將一個(gè)普通指針指直接賦給auto_ptr,而reset()允許。如下例:

auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );

pstr_auto.reset( new string( "Long -neck" ) );

在例子中,重置前pstr_auto擁有"Brontosaurus"字符內(nèi)存的所有權(quán),這塊內(nèi)存首先會(huì)被釋放。之后pstr_auto再擁有"Long -neck"字符內(nèi)存的所有權(quán)。

注:reset(0)可以釋放對(duì)象,銷毀內(nèi)存。

3) release()

返回auto_ptr指向的那個(gè)對(duì)象的內(nèi)存地址,并釋放對(duì)這個(gè)對(duì)象的所有權(quán)。

用此函數(shù)初始化auto_ptr時(shí)可以避免兩個(gè)auto_ptr對(duì)象擁有同一個(gè)對(duì)象的情況(與

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    中日韩美女黄色一级片| 91爽人人爽人人插人人爽| 国产免费一区二区三区不卡| 精品一区二区三区人妻视频| 成人三级视频在线观看不卡| 日韩女优视频国产一区| 亚洲精品日韩欧美精品| 日韩在线免费看中文字幕| 精品国产品国语在线不卡| 亚洲天堂精品1024| 久久这里只精品免费福利| 日韩不卡一区二区在线| 午夜精品国产精品久久久| 亚洲伊人久久精品国产| 91播色在线免费播放| 美女被草的视频在线观看| 最近的中文字幕一区二区| 又色又爽又无遮挡的视频| 精品久久综合日本欧美| 高清免费在线不卡视频| 亚洲一区二区三区三州| 午夜色午夜视频之日本| 久草国产精品一区二区| 亚洲中文在线中文字幕91| 亚洲精品中文字幕无限乱码| 国内欲色一区二区三区| 国产麻豆成人精品区在线观看| 富婆又大又白又丰满又紧又硬| 富婆又大又白又丰满又紧又硬| 五月综合婷婷在线伊人| 视频在线播放你懂的一区| av在线免费观看在线免费观看| 国产免费黄片一区二区| 日本欧美一区二区三区在线播| 99久久无色码中文字幕免费| 国产日韩欧美在线播放| 清纯少妇被捅到高潮免费观看| 久久热中文字幕在线视频| 91精品欧美综合在ⅹ| 99精品人妻少妇一区二区人人妻| 国产av大片一区二区三区|