C 資源管理(13 17條款)

2021-10-03 21:37:35 字數 3432 閱讀 9220

舉個例子:

class

teamsys

teamsys*

createteamsys()

;//返回指向動態分配的物件teamsys的指標,呼叫者有責任刪除它。

voidf(

)

以上**中…,可能會出現異常或者return ,會導致ts所指向的物件資源無法被釋放。

1.使用auto_ptr可以避免f函式潛在的資源洩露可能性:

voidf(

)

auto_ptr被銷毀時會自動刪除它所指之物。

auto_ptr有乙個性質:若通過copy建構函式或copy assignment操作符複製它們,它們就會變成null,而複製所得的指標將取得資源的唯一擁有權。

2.引用計數型智慧型指標(reference counting smart pointer rcsp)。

voidf(

)

auto_ptr和tr1::shared_ptr兩者都在其析構函式內做delete而不是delete動作。所以動態分配而得的array不應該使用這兩者。如果你非要這樣幹,你可以使用boost::scoped_array和boost::shared_array classes。

請記住

class

lock

~lock()

private

: mutex *mutexptr};

mutex m;

//需要鎖定的互斥器

lock ml1

(&m)

;//鎖定

lock ml2

(ml1)

;//將ml1複製到ml2,會發生什麼事?

解決方案:1.禁止複製 2.對底層資源祭出」引用計數「

class

lock

//unlock 為刪除器

private

: tr1::shared_ptr mutexptr;

//不需要析構函式,因為預設系統函式會自動呼叫其成員變數的析構函式,mutexptr引用計數為0時,會自動刪除器unlock

};

請記住

利用資源管理類可以避免資源洩露,但是當你執行下面語句時,

std::tr1::shared_ptrts(

createteamsys()

);intcountsmember

(const teamsys pt)

;int counts =

countsmember

(ts)

;//錯誤,因為countsmember需要的是乙個teamsys指標

解決方法:顯示轉換和隱式轉換

1.tr1::shared_ptr和auto_ptr都提供乙個get成員函式:countsmember(ts.get())返回智慧型指標內部的原始指標。

2.

fonthandle getfont()

;void

releasefont

(fonthandle dh)

;class

font

fonhandle get()

const

;//顯式轉換函式

operator

fonthandle()

const

//隱式轉換函式

~font()

private

: fonthandle f;};

void

changefontsize

(fonthandle f,

int newsize)

;font f

(getfont()

);intnew fontsize;..

.changefontsize

(f.get()

,newfontsize)

;顯式轉換

changefontsize

(f,newfontsize)

;隱式轉換

但是隱式轉換會增加錯誤發生機會,如下:

font f1

(getfont()

)...

fonthandle f2 = f1;

//原意是想拷貝font物件,現在反而將f1隱式轉換為fonthandler,然後才複製它

f1中管理乙個fonthandle物件,但是這個fonthandle物件可以直接使用分取得,如果f1不會銷毀,f2就是」虛吊的「。

請記住

string* str1 =

new string;

string* str2 =

new string[10]

;delete str1;

delete

str2;

typedef string addresslines[4]

;string* pa1 =

new addresslines;

//相當於new string[4]

delete pal;

//行為未定義

delete

pal;

//正確,呼叫者容易忘記寫,因為new的時候沒有

請記住

舉個例子:

int

priority()

;void

processwidget

(std::tr1::shared_ptr pw,

int priority)

;processwidget

(std::tr1::shared_ptr

(new widget)

,priority()

);

c++編譯器以什麼樣的順序執行上面語句的?彈性很大。如果編譯器是這樣執行的:new widget=》priority()=》tr1::shared_ptr。這樣的話,如果prority()發生異常,widget物件尚未置入tr1::shared_ptr內,這個指標是資源管理物件,資源沒有被轉換為資源管理物件,這是錯誤的。

我們可以通過分離語句的方法避免這類問題:

std::tr1::shared_ptrpw(

new widget)

;processwidget

(pw,prority)

;

請記住

條款13 17 資源管理

2.rall class的準則 資源在建構函式期間獲得,在析構函式期間釋放 常見的幾種設計方式 禁止複製 也就是禁止管理類的拷貝建構函式和拷貝賦值操作符 施用引用計數法 例如管理資源為heap物件時,可以使用shared ptr管理 shared ptr支援當引用計數為0時,自定義刪除器替代dele...

C 實現 26 31條款

std string str str password 將password作為encrypted的初值,跳過毫無意義的default構造過程 std string str password 上述行為可以避免構造非必要物件,還可以避免無意義的default構造行為。c風格的轉型 t expressio...

C 資源管理之 RAII

raii,它是 r esource acquisition is initialization 的首字母縮寫。也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。raii的好處在於它提供了一種資源自動管理的方式,當...