通過對動態記憶體管理一節的學習,我將其總結如下::
如果將動態記憶體管理比作一部好萊塢愛情劇的話,可將其中的主要函式物件都比作乙個個角色:
男主角:
男一:malloc函式:
1.函式的原型void* malloc(size_t)
可以在堆記憶體區內開闢出長度為size_t大小的連續記憶體塊,並且返回它的首位址
2.使用該函式需要注意當size_t大到一定程度的時候,malloc是難以從堆記憶體中開闢出如此大的連續記憶體的,那麼這個時候它的返回值為null,因此要對它進行判空
3.該函式開闢出來的記憶體空間並不會被初始化,需要手動對齊進行初始化操做
4.如果size_t==0那莫返回值可能是null也可以不是null,但是切記絕不可以對其進行解引用操作,不然就是未定義行為
男二:realloc
1.函式的原型voidrealloc(void,size_t)
可以將由malloc或者calloc開闢出來的記憶體擴大size_t的長度 ,並且返回連續記憶體的首位址
2.當原來由malloc或者是calloc前面的連續記憶體擁有值時,realloc函式將會移動記憶體,並且返回移動後記憶體的首位址(這個操作非常的吃效能)
3.即使記憶體發生了偏移,那麼這個連續記憶體中的內容仍然會儲存在記憶體中的低位址中,如果新分配的記憶體大小較大,那麼新記憶體中的值將會不確定
4.其他規則與malloc相似
男配角:calloc
1.1.函式的原型voidcalloc(size_t)
2.函式的功能和注意事項和malloc相似,只是會將裡邊的內容初始化為0(這個過程仍舊會吃記憶體),這個函式其實是很少用的,因為記憶體初始化不一定要全部初始化為0,即便是初始化為0,那也可以用memset函式來進行操做,因為用它一樣非常的吃效能
上述三個函式所開闢出來的記憶體都不會隨函式的結束而釋放,必須使用女主來手動釋放
女主角:free(只有乙個,然而異常之關鍵)void free(void)
1.作用:釋放由上述三個男主角開闢出來的堆記憶體.然而絕對不能釋放棧記憶體,在函式中定義的變數,比如char arr[100],如果釋放了,那麼結果將不可預期
2.如果引數傳的是null那麼它將不會做任何事情
3.free只會釋放該指標指向的連續記憶體塊,並不會改變指標的指向
!!!malloc,calloc,realloc所建立的堆記憶體必須由free釋放,不然就會引起記憶體洩漏(程式猿的噩夢)
C 程式設計入門 引用和動態記憶體管理學習
引用 引用就是另乙個變數的別名,通過引用所做的讀寫操作實際上是作用於原變數上。由於引用是繫結在乙個物件上的,所以定義引用的時候必須初始化。函式引數 引用傳遞 1.引用可做函式引數,但呼叫時只需 傳普通變數即可 2.在被調函式中改變引用變數的值,則改變的是實參的值 include include in...
記憶體管理學習筆記
1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...
cocos記憶體管理學習
口訣 1.誰建立,誰釋放。通過new或者clone建立的物件,必須呼叫release或者autorelease。2.new,clone以外的方法建立的物件都被宣告了autorelease。3.誰retain,誰release。無論這個物件是如何生成的,只要呼叫了retain就要呼叫release。正...