讀書筆記 Effective C

2022-03-01 14:17:52 字數 931 閱讀 1008

這個條款比較好理解,就是new有兩種形式:

1

int *p = new

int(); //

申請乙個int資源

2int *p = new

int[3]; //

申請連續三塊int資源

而delete也有兩種資源:

1 delete p; //

delete指標所指向的單一資源

2 delete p; //

delete指標所指向的多個連續資源塊

那麼該各用哪一種形式呢?乙個簡單又好記的規則就是:

在new如果使用了,那麼delete也去用;反之則都不用。一句話,都用或者都不用。

但事實上,如果用錯了,編譯器不會給任何提示,也沒有執行錯(vs2008環境),這些行為是「未定義的」。這可能會產生嚴重的後果,因為這會造成記憶體**不徹底的bug。

上面是一種直觀的形式,如果換成稍稍複雜一些,比如:

1 typedef string addresslines[4];2

string *pal = new addresslines;

那麼該用delete pal還是delete pal呢?

注意這裡用了typedef,addresslines是相當於string[4],pal指向4個連續string記憶體段的首位址,所以這裡應該用delete pal。

這樣看來,與我們之前說的簡記規則又矛盾了,因為new的時候並沒有出現,而delete卻有了。

書上對此作了解釋,「最好盡量不要對陣列形式做typedef動作」,應該用c++標準程式庫中的類似vector來做,這樣就可以避免出錯了。

總結一下:

如果你在new表示式中使用,必須在相應的delete表示式中也使用。如果你在new表示式中不使用,一定不要在相應的delete表示式中使用。

《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替換...