国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
auto_ptr用法

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í)候,必須使用顯式的類(lèi)型轉(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 來(lái)源和接收
當(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ì)改變變量本身的作用域的。

另一個(gè)使用方式,在函數(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;
}


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

當(dāng)使用const auto_ptr<classT>& 的時(shí)候,這個(gè)時(shí)候如果轉(zhuǎn)移所有權(quán)會(huì)出錯(cuò),但是這里存在一個(gè)問(wèn)題,const的意義在于不可以更改傳遞的參數(shù)的數(shù)據(jù),但是在這里我們想實(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)作類(lèi)的成員變量可以避免,當(dāng)類(lèi)在構(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)的資源了??梢允褂?br>auto_ptr來(lái)避免這樣的事情發(fā)生,如果不想在類(lèi)種轉(zhuǎn)換所有權(quán),可以使用const來(lái)修飾。

5 使用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)。
 
 
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
智能指針 std::auto_ptr 和 shared_ptr
auto_ptr智能指針
智能指針
智能指針(auto_ptr 和 shared_ptr)
【轉(zhuǎn)】C++ 智能指針詳解
Boost智能指針——scoped_ptr
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服