很多學過C的人對malloc都不是很了解,知道使用malloc要加頭文件,知道malloc是分配一塊連續的內存,知道和free函數是一起用的。但是但是:
一部分人還是將:malloc當作系統所提供的或者是C的關鍵字,事實上:malloc只是C標准庫中提供的一個普通函數
而且很多很多人都對malloc的具體實現機制不是很了解。
1,關於malloc以及相關的幾個函數
#include <stdlib.h>(Linux下)
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
也可以這樣認為(window下)原型:extern void *malloc(unsigned int num_bytes);
頭文件:#include <malloc.h>或者#include <alloc.h>兩者的內容是完全一樣的。
如果分配成功:則返回指向被分配內存空間的指針
不然,返回空指針NULL。
同時,當內存不再使用的時候,應使用free()函數將內存塊釋放掉。
malloc分配的內存大小至少為size參數所指定的字節數
malloc的返回值是一個指針,指向一段可用內存的起始地址
多次調用malloc所分配的地址不能有重疊部分,除非某次malloc所分配的地址被釋放掉
malloc應該盡快完成內存分配並返回(不能使用NP-hard的內存分配算法malloc和free函數是配對的,如果申請后不釋放就是內存泄露;如果無故釋放那就是什么都沒有做,釋放只能釋放一次,如果釋放兩次及兩次以上會出現錯誤(但是釋放空指針例外,釋放空指針其實也等於什么都沒有做,所以,釋放多少次都是可以的))
實現malloc時應同時實現內存大小調整和內存釋放函數(realloc和free)
關於:void *,表示未確定類型的指針。C,C++規定,void *類型可以強轉為任何其他類型的的指針。
關於void *的其他說法:
void * p1;
int *p2;
p1 = p2; 就是說其他任意類型都可以直接賦值給它,無需進行強轉,但是反過來不可以。
2,malloc和new
new返回指定類型的指針,並且可以自動計算所需要的大小。
int *p;
p = new int; //返回類型為int *類型,分配的大小為sizeof(int)
p = new int[100]; //返回類型為int *類型,分配的大小為sizeof(int) * 100
而malloc則必須由我們計算字節數,並且在返回的時候強轉成實際指定類型的指針。
int *p;
p = (int *)malloc(sizeof(int));
1,malloc的返回是void *,如果我們寫成了: p = malloc(sizeof(int));間接的說明了(將void *轉化給了int *,這不合理)
2,malloc的實參是sizeof(int),用於指明一個整形數據需要的大小,如果我們寫成:
p = (int *)malloc(1), 那么可以看出:只是申請了一個字節的空間,如果向里面存放了一個整數的話,
將會占用額外的3個字節,可能會改變原有內存空間中的數據
3,malloc只管分配內存,並不能對其進行初始化,所以得到的一片新內存中,其值將是隨機的。一般意義上:我
們習慣性的將其初始化為NULL。 當然,也可以用memset函數的。
簡單的說:
malloc 函數其實就是在內存中:找一片指定大小的空間,然后將這個空間的首地址給一個指針變量,這里的指針變量可以是一個單獨的指針,也可以是一個數組的首地址, 這要看malloc函數中參數size的具體內容。我們這里malloc分配的內存空間在邏輯上是連續的,而在物理上可以不連續。我們作為程序員,關注的 是邏輯上的連續,其它的,操作系統會幫着我們處理的。
3、malloc,free和new,delete的區別
(1)malloc和new都是在堆上分配內存。棧區的內存分配是系統自動分配釋放的,主要存放函數的參數值、局部變量的值等。
(2)Malloc和free在C程序中使用,而C++程序中使用new和delete,刪除數組delete[]p,指針釋放后,要將指針置空。
(3)New和delete可以調用構造函數和析構函數。
(4)Malloc是函數,new是關鍵字。
(5)Malloc不能賦初值,new可以,如int *p = new int(2).代表分配一個int型的內存空間,並賦初值2.如果new int ()代表賦初值0,new int[10]代表分配10個int.
(6)Malloc返回的指針是void *類型,而new返回的指針是它分配空間的類型。