new 和 malloc都可以用來動態分配內存,那么什么c++要都此一舉的增加一個新的運算符呢?原因是在實例化類時,要調用類中的構造函數,傳統的malloc函數無法完成這樣的功能,所以只能新增運算符
陸豐ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
相同點:都會分配內存
不同點:
(1)如果構造函數和析構函數,則new和delete會分別調用構造函數和析構函數,malloc和free則不會
(2)malloc和free是函數,而new和delete是運算符
c語言中malloc函數和realloc函數的區別為:分配不同、釋放不同、強制轉化不同。
一、分配不同
1、malloc函數:malloc函數對沒有分配過的內存塊直接進行分配。
2、realloc函數:realloc函數是在已經分配好的內存塊重新進行分配。
二、釋放不同
1、malloc函數:malloc函數分配好的內存塊一般要用free(size_t size)來釋放內存塊。
2、realloc函數:realloc函數分配好的內存塊不需要用free(size_t size)來釋放內存塊。
三、強制轉化不同
1、malloc函數:malloc函數需要強制轉化。
2、realloc函數:realloc函數不需要強制轉化。
這三個函數實現的功能是交換兩個數,但實際只有第一和第三種可以成功交換原來的傳進來的實參,第二種交換的是形參的值,并不會改變實參的值
首先,要知道一點,函數調用的實質都是實參按值傳遞給形參,所以第一、二種函數接受的實參都是 int 類型兩個數據,此處假設分別是 a 和 b ,而第三種函數接受的實參是一個 int 類型數據的地址,即為 a 和 b (此處的 表現為 “ 取地址符 ” ,在 C 語言中 具有多種功能,比如后面表現出來的 “ 引用符號” 的作用,這稱作運算符的重載 )。
那么開始分析函數:
第一種,形參為 int x 和 int y(此處的 表現為 “ 引用符號 ” )
執行的操作為
int??x?=?a?;
int??y?=?b?;
其中 x 和 y 分別是 a 和 b 的引用, 如果我們把變量名理解為一段內存空間的標識符,那么引用可以理解對一段內存空間的另一個標識符,也就是說同一段內存空間可以用多個名字來標志。因為 x 和 a 表示的是同一內存空間的標識符,所以修改 x 所代表的內存空間的值就相當于修改 a 所代表的內存空間的值,y 與 b 的關系同理。
第二種,形參為?int x 和 int y
執行的操作為
int?x?=?a?;
int?y?=?b?;
其中 x 和 y 都是局部變量,x 和 y 所代表的內存空間與 a 和 b 所代表的內存空間不同,這里把 a 和 b 所代表的內存空間的值通過賦值操作分別拷貝了一份,送給了 x 和 y所代表的內存空間,即 x 和 y 所代表的內存空間的值分別與 a 和 b 所代表的內存空間的值是相同的,但它們所代表的內存空間是不一樣的,即內存空間的地址不同。所以交換 x 和 y 的內存空間的值并不會影響 a 和 b 的內存空間的值。
第三種,形參為?int * x 和 int * y
執行的操作為
int?*?x?=?a?;
int?*?y?=?b?;
其中 x 和 y 分別是指向了 a 和 b 的內存空間的指針,x 和 y 也是局部變量,所以跟第二種函數一樣,他們與 a 和 b 的內存空間也是不一樣的,但是不同點在于,x 和 y 的內存空間里所存儲的值是 a 和 b 的地址。所以通過 *x 和 *y 來訪問 a 和 b 空間里值,這里的 * 表示是 “ 間接訪問符 ”(與 一樣,也是 * 的一種重載),它的功能是把 x 和 y 空間中的值(a 和 b 的內存空間的地址)當作地址找到 a 和 b 的內存空間,因此 *x 與 a 是等價的,*y 與 b 是等價的。所以交換 *x 和 *y 的值 就是交換 a 和 b 的值。
最后,總結一下,第一種引用交換和第三種指針交換的區別在于,指針需要另外開辟新的空間來儲存地址,而引用并不需要額外的空間。
動態內存分配即分配內存大小在運行時才確定,一般在堆中分配。C語言動態內存分配相關的函數。
malloc
#include stdlib.h
void * malloc (size_t size);
malloc的使用比較直接,一個成功的malloc調用返回分配的size大小的內存的指針。失敗時返回NULL并將錯誤代碼置為ENOMEM。
教材中經常出現的用法是將malloc返回的void指針進行強制內存轉換然后賦給內存指針,其實是不必要的,在賦值時C語言是可以將void類型指針自動轉換成對應的指針的。
calloc
#include stdlib.h
void * calloc (size_t nr, size_t size);
calloc可以分配nr個size大小的內存空間,一般用于一組struct結構體的分配。
那么calloc和malloc有什么區別呢?拋開nr參數不談(malloc也可以將參數設置為nr*size達到一樣的效果),最關鍵的區別是malloc分配的內存是不保證初始化的,而calloc會將分配的內存都初始化為0.
realloc
#include stdlib.h
void * realloc (void *ptr, size_t size);
realloc函數將ptr指向的內存空間重新分配大小為size并返回新的內存首地址。具體的實現,函數首先會嘗試直接在已經分配的內存后進行padding,如果空間足夠那么還是返回原來的地址,如果不夠,則會尋找新的空間并malloc size個字節,之后再將原先的內容“搬家”到新的內存地址,所以函數的返回值可能和原指針相同,也可能不同。
另外,size參數如果是0,則該函數和free效果相同。如果ptr是NULL,函數的效果和malloc相同~
free
#include stdlib.h
void free (void *ptr);
釋放前三個函數申請的內存空間。關于free最經典的問題就是內存泄露(memory leak)。所以,使用前三個分配函數分配的內存一定要記得free掉。
網頁標題:c語言內存對比函數,c語言內存比較
文章源于:http://m.kartarina.com/article2/hddeoc.html
成都網站建設公司_創新互聯,為您提供營銷型網站建設、、關鍵詞優化、用戶體驗、企業建站、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯