一、記憶體分割槽
每乙個程式在執行的時候都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區或堆。
c語言程式使用一對標準函式malloc和free在自由儲存區中分配儲存空間;
c++語言則使用new和delete表示式實現相同的功能
三、const 物件的動態分配和**
1、c++允許動態建立const 物件:
const
int*pci =
newconst
int(
1024
);
上述new表示式返回指向const int 物件的指標
對於類型別的const動態物件,如果該類提供了預設的建構函式,則此物件可隱式初始化
const string *pcs =
newconst string;
new表示式沒有顯式初始化pcs所指向的物件,而是隱式的將pcs所指向的物件初始化為空的string 物件。
內建型別物件或者未提供預設建構函式的類型別物件必須顯式初始化。
2、刪除const物件
儘管程式設計師不能改變const物件的值,但可撤銷物件本身。
與其他動態物件一樣,const動態物件也是使用刪除指標來釋放的;
delete pci;
四、malloc/free與new/delete的區別
1、相同點:都可用於申請動態記憶體和釋放記憶體
2、不同點:
①:malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子
②:malloc/free需要庫檔案支援,new/delete則不需要
③:new自動計算需要分配的空間,而malloc需要手工計算位元組數
④:new是型別安全的,而malloc不是;比如:
int
* p =
newfloat[2
];//編譯時指出錯誤
itn* p =
(int*)
malloc(2
*sizeof
(double))
;//編譯時無法指出錯誤
⑤:new呼叫operator new 分配足夠的空間,並呼叫相關物件的建構函式,而malloc不能呼叫建構函式;
delete將呼叫該例項的析構函式,然後呼叫類的operator delete 以釋放該例項占用的空間,而free不能呼叫析構函式
五、堆與棧的區別
①管理方式的不同:棧是編譯器自動管理的,堆需手動釋放
②空間大小不同:在32位os下,堆的記憶體可達到4gb的空間,而棧就小的可憐
③能否產生碎片不同:對於棧來說不會產生碎片,而堆容易產生碎片
④生長方向不同:棧是向下生長,以降序分配記憶體位址;
堆是向上生長,以公升序分配內在位址
⑤分配方式不同:堆動態分配,無靜態分配
⑥分配效率不同:堆的效率要比棧低很多
六、記憶體溢位、記憶體洩漏
記憶體溢位:是指程式在申請記憶體的時候,沒有足夠的記憶體空間,占用有用記憶體
記憶體越界:是指向系統申請一塊記憶體後,使用時卻超出申請範圍
記憶體洩漏:是指程式在申請記憶體後,無法釋放已申請的記憶體空間,占用有用記憶體;
注:記憶體洩露最終會導致記憶體溢位
記憶體洩露分為4類:
1、常發性記憶體洩漏
引起記憶體洩漏的**會被執行很多次,每次執行的時候都會導致記憶體洩漏
2、偶發性記憶體洩漏
在某些特定的環境下執行引起記憶體洩漏的**,才會引起記憶體洩漏
從上述兩種記憶體洩漏的方式來看,測試環境和測試方法在程式生命週期的重要性是不可或缺的
3、一次性記憶體洩漏
**只會執行一次,但總有一塊記憶體發生洩漏,多見於構造類的時候,析構函式沒有釋放記憶體。
4、隱式洩漏
程式執行過程中不斷的分配記憶體,直到結束時才釋放記憶體,但一般伺服器程式會執行較長時間,不及時釋放也會導致記憶體耗光以至於記憶體洩漏
記憶體管理之空間分配與釋放
分配空間與釋放空間函式 1.malloc,free void malloc long numbytes 該函式分配了numbytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回乙個空指標 null 關於分配失敗的原因,應該有多種,比如說空間不足就是一種。void free void ...
delete 與 delete 釋放記憶體
以下內容來引自 我們通常從教科書上看到這樣的說明 delete 釋放new分配的單個物件指標指向的記憶體 delete 釋放new分配的物件陣列指標指向的記憶體 那麼,按照教科書的理解,我們看下下面的 int a new int 10 delete a 方式1 delete a 方式2 肯定會有很多...
指標與delete釋放記憶體
下表列出了 c 支援的其他一些重要的運算子。運算子描述 sizeof sizeof 運算子返回變數的大小。例如,sizeof a 將返回 4,其中 a 是整數。condition x y 條件運算子。如果 condition 為真 則值為 x 否則值為 y。逗號運算子會順序執行一系列運算。整個逗號表...