日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

auto_ptr使用总结

發(fā)布時(shí)間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 auto_ptr使用总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(1) auto_ptr的意義
auto_ptr是一種智能指針,當(dāng)系統(tǒng)異常退出的時(shí)候避免資源泄漏(內(nèi)存)。
其他的資源還對(duì)應(yīng)其他的智能指針。

(2) auto_ptr的使用
std::auto_ptr<int> test(new int(1));
test將是一個(gè)auto_ptr的對(duì)象,使用一個(gè)int指針進(jìn)行初始化。
test可以象其他指針一樣使用,如使用* 使用->但是++不可以使用,以后也許會(huì)擴(kuò)展,其實(shí)難對(duì)++做越界管理,也許可以放棄一些速度。

當(dāng)使用auto_ptr的時(shí)候,必須使用顯式的類型轉(zhuǎn)化來(lái)初始化,如auto_ptr<classA> a(new classA),而不能使用auto_ptr<classA> a = new classA;

(3) auto_ptr所有權(quán)的轉(zhuǎn)移
auto_ptr對(duì)所有權(quán)有嚴(yán)格的約定,一個(gè)auto_ptr只能控制一個(gè)指針,不能控制多個(gè),當(dāng)auto_ptr擁有一個(gè)指針的時(shí)候就不能在擁有其他的指針了。同時(shí),不同的auto_ptr不能擁有同一個(gè)指針。但是存在這樣的情況,不同的auto_ptr可能控制著相同的對(duì)象,不要出現(xiàn)這樣的情況。
auto_ptr<int> a(new int); 1
auto_ptr<int> b(a); 2
auto_ptr<int> c = b; 3
auto_ptr<int> d(int); 4
d = c; 5
當(dāng)2發(fā)生的時(shí)候,a將所有權(quán)放棄,b獲得所有權(quán)。
當(dāng)3發(fā)生時(shí), b將放棄所有權(quán),c獲得所有權(quán)。
當(dāng)5發(fā)生時(shí), c的所有權(quán)給d,d將釋放自己的所有權(quán),并把對(duì)象刪除掉。

(4) 作為參數(shù)會(huì)改變作用域
當(dāng)auto_ptr以參數(shù)的形式傳遞給函數(shù)的時(shí)候,作用域同樣發(fā)生了變化,從之前的作用域變成了函數(shù)內(nèi)部的作用域。過(guò)程時(shí)這樣的,當(dāng)有auto_ptr作為參數(shù)傳遞到函數(shù)內(nèi)部的時(shí)候,首先會(huì)交接自己的所有權(quán),所有權(quán)交給了函數(shù)的參數(shù),作用域變成了函數(shù)的內(nèi)部。函數(shù)退出時(shí),函數(shù)內(nèi)部的臨時(shí)變量都會(huì)離開(kāi)作用域,包括傳遞進(jìn)來(lái)接收到的auto_ptr,auto_ptr會(huì)釋放自己保存的資源。在函數(shù)退出后,申請(qǐng)的資源就消失了,這種情況可能很出乎人的預(yù)料,因?yàn)閏++一般傳遞參數(shù)都是傳值,如何都不會(huì)改變變量本身的作用域的。

(6)在函數(shù)內(nèi)部返回一個(gè)指針,可以避免內(nèi)存泄漏
#include <iostream>
using namespace std;
template<class T>
auto_ptr<T> getAutoPtr()
{
?auto_ptr<T> rt(new T);
?return rt;
}
int main(void)
{
?auto_ptr<int> rt = getAutoPtr<int>();
?cout<< "["<< *rt<< "]"<< endl;
?return 0;
}

(5)作為參數(shù)時(shí),不要傳遞引用
函數(shù)的參數(shù)可以是auto_ptr<classT>& 類型,當(dāng)傳遞auto_ptr的引用的時(shí)候,有的時(shí)候會(huì)傳遞所有權(quán),有的時(shí)候不會(huì),所以永遠(yuǎn)不要這樣做。

(6)const auto_ptr<classT>& 實(shí)現(xiàn)的是不需要傳遞所有權(quán)。這個(gè)特性主要應(yīng)用在模板上,當(dāng)使用auto_ptr實(shí)例化對(duì)象的時(shí)候不會(huì)出現(xiàn)問(wèn)題。所以const auto_ptr<classT>&的意思是不能轉(zhuǎn)移所有權(quán),而不是不能更改數(shù)據(jù),這里和c++信息是不一樣的,還是少使用好一些。
?auto_ptr當(dāng)作類的成員變量可以避免,當(dāng)類在構(gòu)造的時(shí)候出現(xiàn)異常,這樣如果內(nèi)存被分配了是不會(huì)被釋放的,因?yàn)槿绻麡?gòu)造沒(méi)有完成是不會(huì)調(diào)用析構(gòu)函數(shù)的,這個(gè)時(shí)候就沒(méi)有辦法來(lái)釋放申請(qǐng)的資源了。可以使用auto_ptr來(lái)避免這樣的事情發(fā)生,如果不想在類種轉(zhuǎn)換所有權(quán),可以使用const來(lái)修飾。

(7) 使用auto_ptr的誤區(qū)
?1 兩auto_ptr不要引用同一個(gè)對(duì)象(t*),這樣如果一個(gè)auto_ptr釋放了資源,另一個(gè)或多個(gè)就無(wú)法獲得引用對(duì)象的信息。
?2 auto_ptr不可以保存array,因?yàn)樵卺尫诺臅r(shí)候是使用delete,這樣就會(huì)引起未知的問(wèn)題。
?3 auto_ptr設(shè)計(jì)成在異常發(fā)生的時(shí)候避免內(nèi)存泄漏,不要亂用。

?4 不要在容器中使用auto_ptr,因?yàn)闊o(wú)法滿足容器的一些要求,比如在copy construct和 “=”操作時(shí),會(huì)轉(zhuǎn)移所有權(quán)。



在我們實(shí)際的使用過(guò)程中如果我們需要使用auto_ptr作為參數(shù)在函數(shù)中進(jìn)行傳遞時(shí),應(yīng)注意控制權(quán)的問(wèn)題,

在傳遞過(guò)程中我們使用引用的方式:例如:

function中進(jìn)行傳遞時(shí)使用指針進(jìn)行傳遞

function(*param);

function(class& param)

在定義fuction時(shí)使用引用的方法進(jìn)行定義,這樣在使用過(guò)程中避免指針出現(xiàn)的問(wèn)題,使用引用更加安全

總結(jié)

以上是生活随笔為你收集整理的auto_ptr使用总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。