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;
}
聯(lián)系客服