C和C++的區別:new /delete 和 malloc/free
阿新 • • 發佈:2018-11-28
幕布分享: https://mubu.com/doc/vQfZHGsDG0
動態分配記憶體: 在程式執行中進行的,而不是在編譯就確定的
new 堆上分配記憶體
(1) 開闢T位元組大小空間: Tp =new T; size: sizeof(T)
T 是任意型別名,p 是型別為 T 的指標 ,起始地址賦給p
(2) 動態分配任意大小陣列: T b = new T[ N ] size: sizeof( N * T) T 是任意型別名,p 是型別為 T* 的指標,N 代表“元素個數”, 可以是任何值為正整數的表示式
delete
(1) delete p
(2) delete []p
- 【問題1】malloc/free和new/delete區別
https://www.cnblogs.com/QG-whz/p/5140930.html
特徵 | new/delete | malloc/free |
屬性 | 運算子 | 庫函式 |
分配記憶體位置 | 自由儲存區為物件動態分配 | 堆上動態開闢 |
分配成功返回值 | 與物件型別相匹配的指標符合(型別安全的操作符) | 返回void*,然後再強制型別轉換為需要的型別 |
分配失敗返回值 | 丟擲異常(bad_alloc) | NULL |
記憶體分配的大小 |
自動識別 | 手動計算 |
已分配記憶體的擴充 | 無法直觀處理 | realloc |
處理陣列 | 有處理陣列的new[] | 需要計算陣列大小後進行記憶體分配 |
相互呼叫 | 可以呼叫new/delete | / |
分配記憶體時記憶體不足 | 指定處理函式/重新制定分配器 | 無法通過使用者程式碼處理 |
函式過載 | 允許 | 不允許 |
建構函式與解構函式 | 呼叫 | 不呼叫 |
- 【問題2】 如果用delete p 去釋放 int*p=new int[20]
編譯沒有問題,執行時也一般不會發生錯誤,但實際上會導致【動態分配的陣列沒有被完全釋放】
- 【問題3】delete後 指標的值是多少?
釋放一個指標,並不會使該指標的值變為NULL
- 【問題4】如果new 後,沒有及時delete會發生什麼?
(1)new完以後沒有及時地delete=》導致記憶體洩露===》即使程式執行解釋,這部分記憶體也沒被作業系統收回
(2)如果一直動態分配,卻沒有釋放,可用記憶體被大量消耗,CPU變慢,重啟OK
- 【問題5】為什麼要過載new / delete?
(1)出於效率考慮:也許要建立和銷燬一個特定的類的非常多的物件以至於這個運算變成了速度的瓶頸。
(2)堆碎片:分配不同大小的記憶體可能會在堆上產生很多碎片,以至於很快用完記憶體。雖然記憶體可能還有,但是由於都是碎片,也就找不到足夠大的記憶體塊滿足需要。通過為特定類建立自己的記憶體分配器,可以確保這種情況不會發生。
(3)編譯器看到new時,編譯器分配記憶體並呼叫建構函式,但是當過載new時,可以改變的只是記憶體分配部分。