c/c++如何擷取malloc配置設定的記憶體空間大小
簡介
本文主要介紹了兩種c/c++擷取malloc配置設定記憶體空間大小的方式,如下:
- 通過指針
- 通過調用函數
應用場景(arm_linux 開發闆):
在項目開發過程中,被調函數主動配置設定的堆區記憶體如何擷取其大小呢?
在不知道其記憶體大小的情況下使用起來感覺并不友善,而且容易引發記憶體問題。
通過指針查詢記憶體大小
在使用malloc或new主動配置設定記憶體時,系統會所配置設定的記憶體空間首位址的前4個位元組中存儲着所配置設定的記憶體大小值。
假設記憶體的首位址為p,那麼所配置設定的記憶體大小為*((int)p-4),此處的類型強制轉換是由于可能p指向的記憶體不是int型而導緻 p-4 并不是隻減去4個位元組的大小。
通過函數查詢記憶體大小
調用malloc.h檔案庫中的malloc_usable_size()函數可直接擷取所配置設定記憶體空間的大小,c++中則調用_msize()函數
示例
如下定義一結構體stu,并使用結構體指針pstu配置設定若幹個(此處14個)sizeof(stu)的記憶體空間
typedef struct
{
char name[9];
}stu;
int main()
{
int cnt = 0;
stu *pstu = NULL;
int *p = NULL;
int stulen = sizeof(stu);
pstu = (stu *)malloc(sizeof(stu)*14);
p = (int)pstu-4; //将stu *類型強制轉換為 int類型,擷取pstu第前四個位元組位址。
cnt = (*p-5)/stulen; //求取配置設定的stu類型的數目
printf(" addr: %d \n stulen:%d \n cnt:%d\n size:%d\n size():%d \r\n",p, stulen, cnt, *p-5, malloc_usable_size(pstu));
free(pstu); //需要主動釋放記憶體
pstu = NULL; //防止出現野指針}
注:上述通過指針得到記憶體大小總比函數查詢的記憶體大5個位元組。
結果列印
注:在malloc配置設定記憶體過程中有一定的規則
- 當所配置設定記憶體<=12byte 系統會預設配置設定12byte,即系統配置設定最小記憶體數。
- 當需要配置設定記憶體>12byte時,系統會以8byte為機關進行疊加。同時還需要注意的是不同系統的最小記憶體配置設定數和遞增步長可能有所不同(可以通過增加stu的長度來測試)。
- 若要通過上述方法求取stu的數目至少有兩個條件,1、sizeof(stu)>=8 ; 2、stu長度固定