effective c 讀書筆記 三

2021-08-08 20:53:59 字數 2228 閱讀 6085

資源就是你用了它,最後還要把它換回去。常見的資源包括:記憶體,檔案描述器,互斥鎖,圖形介面中的字形和筆刷,資料庫連線,以及網路sockets。

class investment;

investment* createinvestment();

void f()

上述**如果在delete前過早的執行return語句,或由於continue,goto等過早的退出。或提前丟擲異常,等情況下,delete語句將不會執行,無法釋放叼申請的記憶體,導致記憶體洩漏。或者由於維護人員對程式的理解不夠深入,而加入了異常處理或這提前return 的語句都將導致記憶體洩漏的問題。

為了確保createinvestment返回的資源總是被釋放。應該將資源放進物件內,當控制流離開f函式是,該物件的析構函式會自動釋放那些資源。

void f()
使用上述的方法可以避免記憶體洩漏的問題。體現了兩個關鍵的想法:

1:獲得資源後,立刻放進管理物件內;資源取得時機辨識初始化時機。

2:管理物件運用析構函式確保資源被釋放

上條規則中所說的管理資源的方法都是針對heap-based型別資源的方法,但是並非所有資源都是heap-based,對於那些資源而言,智慧型指標就不再適合作為資源管理者。有的時候,需要自己建立自己的資源管理類。

//c api 函式處理型別為mutex的互斥器物件。

void

lock(mutex *pm);//鎖定pm所指的互斥器

void unlock(mutex *pm); //將互斥器解除鎖定

//有時為了不忘記將乙個被鎖住的mutex解鎖,希望自己建立乙個管理機鎖

class lock

~lock

private:

mutex *mutexptr;

};mutex m;

//...

//但是當出現lock物件複製的情況下

lock m11(&m);

lock m12(m11);

針對上面的問題有兩種選擇:1:禁止賦值可以將copying操作宣告為private的。2:對底層資源祭出「引用計數法」一般來說可以通過資源管理類來進行處理和資源之間的所有互動,但是有的時候你必須繞開資源管理類直接訪問原始資源。在此種情況下,應該在資源管理類中提供對於原始資源的訪問方法,一般有顯示型別轉換,和隱式型別轉換兩種方法。顯示型別轉換一般情況下要比隱式轉換方法更加的安全。

std::shared_ptr

pinv(createinvestment());

int daysheld(const investment *pi);

int days = daysheld(pinv); //false

因為daysheld需要的是investment*指標,但是傳遞給他的是shart_ptr的物件。

可以通過加入get成員函式進行顯示的型別轉換。int days = daysheld(pinv.get());

如果new表示式中使用,必須響應的delete表示式中使用。同理反之。

因為如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩漏問題。

int priority();

void processwidget(std:

:shared_ptrpw, int priority());

processwidget(new widget, priority()); //false 不能通過編譯,因為shared_ptr建構函式需要乙個原始指標,但該建構函式是個explicit建構函式,無法進行隱式轉換

processwidget(std:

:shared_ptr(new widget), priority()); //可能導致記憶體洩漏

std:

:shared_prt pw(new widget);

processwidget(pw, priority()); //true

processwidget(std::shared_ptr(new widget), priority());編譯器的執行順序不一定,如果呼叫priority()函式在shared_ptr建構函式之前。然後priority()函式丟擲了異常,會導致new widget的指標丟失,導致記憶體洩漏。

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

Effective C 讀書筆記

一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...

讀書筆記 Effective C

部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...