高質量程式設計指南 c c 語言 筆記之記憶體管理

2021-06-06 20:08:49 字數 1607 閱讀 1065

* .記憶體的3種分配方式

1.從靜態儲存區域分配:即在編譯程式的時候就已經分配好了,在程式的整個執行期間都存在: 全域性變數、static變數

2.在堆疊上分配:函式執行期間分配。堆疊的的分配運算內置於處理器的指令集中,效率很高,失敗率不高,分配的記憶體容量有限,可能出現堆疊溢位。

3.從堆或自由儲存空間上分配,即動態記憶體分配。malloc new free delete  ,其生存期由程式設計師決定,靈活但也最容易出問題。

一般原則:如果能夠使用堆疊來滿足應用要求,那麼就不要使用動態儲存。

*.因為需要呼叫作業系統中記憶體管理模組的堆管理器,多次動態分配後,堆會千瘡百孔,開銷比較大。

*.常見記憶體錯誤

1.記憶體分配未成功。

2.記憶體分配雖然成功,但是尚未初始化就使用它。

3.記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。

4.忘記釋放記憶體造成記憶體洩漏。

5.釋放了記憶體卻還在繼續使用它。

**** free() delete() 後,沒有將指標設定為null,將產生野指標。

6.不要多次釋放同一記憶體塊。

注意:指標的消亡並不代表記憶體也釋放了。這個東西是不會自動釋放的。必須我們手動釋放,new 必須 跟乙個free.

*.野指標

1.沒有初始化的指標變數

2.指標被free delete之後,沒有設定為null,讓人誤以為仍然是乙個有效的指標。

3.指標操作超越了變數的作用範圍。 即指標指向了乙個堆疊空間的位址。超出了該變數範圍,則該指標就無效了。

*.使用new/delete更加安全

因為new可以自動計算它要構造的物件的位元組數量,而malloc()則不能,new直接返回目標型別的指標,不需要顯示的轉換,而malloc則返回void*,需要顯示地轉換目標型別後才能使用。 

new delete可以實現自定義,malloc free 則不能夠別過載。

某些情況下,使用malloc free 比new delete要更效率,所有有些stl實現的記憶體分配器會選擇mallocfree來進行儲存管理。

new的3種使用方式:

1.普通new: plain new

2.不丟擲異常new: nothrow new => 就是不丟擲異常的運算子new的形式,nothrow new在失敗時返回null,所以使用它時候就不需要設定異常處理,而是像過去一樣檢查返回值是否為null即可

例子: char *p = new(nothrow) char[3]; 

3.不開闢記憶體空間的new. placement new . 放置new :即這種new形式允許在一塊已經分配成功的記憶體上重新構造物件或者物件陣列。  顯然,placement new不用擔心記憶體分配失敗,因為他根本就不會分配記憶體。唯一做的事情就是呼叫物件的建構函式:哈哈,這個事情是new經常做的。

例子:int *q = new (p) int;   p : 就是乙個指標,表示已經分配成功號的記憶體塊的首位址。此時的new就不需要配合乙個delete, 而只需要delete p ,即可。

作用:反覆使用乙個已經成功的記憶體塊。 不要使用delete來釋放placement new,使用placement new構造出來的物件的大小不一定是那個空間的大小,所以就算是delete了這個new,但是也會出現記憶體洩漏的情況。 

高質量程式設計指南 C C 語言》筆記記錄

1 字面常量 下面是一些字面常量 float x 100.5f define open success 0x000000001 char c a char ptr i love andy int pint null 號後面的是字面常量,字面常量儲存在程式的符號表裡而不是在一般的資料區。符號表是唯讀的...

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...

高質量C C程式設計指南

目錄 前 言.6 第1章檔案結構 11 1.1 版權和版本的宣告 11 1.2 標頭檔案的結構 12 1.3 定義檔案的結構 13 1.4 標頭檔案的作用 13 1.5 目錄結構 14 第2章程式的版式 15 2.1 空行.15 2.2 行.16 2.3 行內的空格 17 2.4 對齊.18 2.5...