1.相同點
失敗:null
2)使用之前都要進行判斷是否為空
3) 釋放空間的方式:free
4) 返回值:void* (可以強制型別轉換)
2.不同點
1) malloc 引數:(位元組數) 功能:負責將空間給出
2)calloc 引數:(單個元素位元組數,元素個數) 功能:給出空間,且對空間進行初始化為0
若p為null,則realloc功能和malloc相同。
若p不為null:
1、c++管理記憶體的例子
2.總結:
new 做了兩件事:1)呼叫operator new 分配空間
2)呼叫建構函式初始化物件
delete也做了兩件事:1)呼叫析構函式清理物件
2)呼叫operator delete 釋放空間
new [n] :1) 呼叫operator new 分配空間
2) 呼叫n次建構函式初始化每個物件
delete [n]: 1)呼叫n次析構函式清理物件 (棧序,倒著銷毀)(4中給出n的由來,請看下面)
2) 呼叫operator delete 釋放空間 (空間起始位置進行free)
編譯器在new出的陣列物件頭指標向前4個位元組中記錄了物件的數目(4個位元組對應乙個int值)
注意:new和delete、new[ ]和delete[ ] 一定要匹配使用!!!
malloc / free 在c++中也是可以使用的,只是malloc和free在c++中不能分別呼叫建構函式和析構函式來初始化物件和釋放物件
3.不同的型別記憶體洩漏問題
對於內建物件,如果沒有匹配釋放,不會造成記憶體洩漏。
對於自定義型別(class,struct)且析構函式顯式給出的情況:
1)如果沒有匹配使用,記憶體洩漏&程式崩潰。
2)如果析構函式沒有給出,也沒有來匹配使用,可能會造成記憶體洩漏。
.4.析構函式對記憶體洩漏的影響
1)給出析構函式
malloc ---> delete / delete [ ] (free)
new ------>delete / delete [ ] (free)
new [ ]-----> delete / delete [ ] (free)
2)沒有給出析構函式
new--->free : 物件中的資源沒有清理
new---->delete [ ] :一定會崩潰
new [ ] ---> free :物件中的資源沒有清理&一定會崩潰
new [ ]--->delete :只會銷毀乙個物件(n-1)個物件沒有清理&一定會崩潰。
1.含義:在已經存在的空間上執行建構函式
3.呼叫方式:operator new (size_t void*where)比如:
int main()
1.malloc / free :c語言中 new / delete :c++中2.malloc / free :是函式 new / delete : 操作符3.引數上:malloc(位元組數) new + 型別4.返回值上:malloc-->void* (可以強制轉換) new 不需要5.malloc 要判斷是否為空 new 有應用措施,不要判空,捕獲異常
6.malloc / free :不會呼叫構造/析構函式 new/delete:會呼叫構造/析構函式
7.malloc :不能初始化 new可以初始化
8.malloc :在堆上申請 new:不一定在堆上,operator new(可以自定義申請的位置空間)
1.使用系統自帶的記憶體洩漏的檢測工具。
2.自己寫乙個記憶體洩漏檢測工具。
3.使用第三方工具:vld,debugdiag tools等。
1 良好的程式設計規範
2.智慧型指標
c c 記憶體管理
我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...
C C 記憶體管理
寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...
C C 記憶體管理
首先來看一下c c 中記憶體的分布 棧區 又稱作堆疊,非靜態區域性變數,函式引數,返回值都是儲存在棧區的,函式棧幀的建立也是在棧區的 一般棧區的大小只有十幾m 資料段 存放靜態資料和全域性資料的。段 存放可執行的 和唯讀常量。了解完記憶體的分布接下來我們來了解記憶體的管理方式 在c語言中記憶體的管理...