⑴ linux malloc內存越界
很明顯,int *ab=new int[count];對ab[]只能操作下標從[0]到[count-1]的,但你在for(int ks=0;ks<=count;ks++)循環中,ks可以=count,操作了ab[count],越界操作。在windows下運行時沒有問題,只是碰巧越界操作的內存是沒用的內存。
⑵ linux malloc 線程安全 哪個版本
linux malloc函數的底層是brk,sbrk系統調用現的, windows是其他的系統調用、linux下的malloc函數在該進程第內一次申請內存的時候容實際會像內存請求33頁的大小(1頁=4096位元組), 之後程序中再用到malloc的時候就可以直接在這33頁中分配, 而不需要系統調用, 減少內核到用戶態的切換, 提高效率。
你這樣寫實際上就是你開辟了10個int的地方,卻要存11個int的數據,那麼肯定free有問題
而正好windows的越界操作的內存是有用的內存,當然你可以多試幾次
⑶ 求教《Linux程序設計》中一個malloc內存分配的問題
malloc是C庫的吧。 C庫有自己的內存管理方法。
用malloc分配1K位元組,在申請了1頁內存回(4K)後,C庫的內答存管理應該會記住這空閑的3K內存,當有小於3K的內存分配時,應該會從這裡面進行分配吧~
malloc應該底層調用的brk,不會這么不節約吧?下層的確是分配的整頁給malloc,但是malloc也應該會很節約,一個頁提供大約三四次分配的。
我覺得問題在於malloc自己管理內存的數據結構佔去了大部分的空間。不知道對不對。
轉載,僅供參考。
⑷ malloc怎麼使用,請舉例說明,謝謝!
malloc使用須要包括頭文件:
#include 'stdlib.h'
例如:
int *p;
p = new int; /返回類型為int* 類型(整數型指針)。分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型為 int* 類型(整數型指針)。分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計算要位元組數,而且在返回後強行轉換為實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
malloc 函數返回的是 void * 類型。
對於C++,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。
所以必須通過 (int *) 來將強制轉換。而對於C,沒有這個要求,但為了使C程序更方便的移植到C++中來,養成強制轉換的習慣。
在Linux中可以有這樣:malloc(0),這是因為Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系統中是不允許malloc(0)的。
在規范的程序中我們有必要按照這樣的格式去使用malloc及free:
type*p;
if(NULL==(p=(type*)malloc(sizeof(type))))
/*請使用if來判斷,這是有必要的*/
{
perror("error...");
exit(1);
}
.../*其它代碼*/
free(p);
p=NULL;/*請加上這句*/⑸ malloc怎麼用呢
原型
extern void *malloc(unsigned int num_bytes);
頭文件
#include <stdlib.h>
功能
分配長度為num_bytes位元組的內存塊
返回值
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
說明
關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
名稱解釋
malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
相關函數
calloc、realloc、free、_alloca
2函數聲明編輯
全名
void *malloc(size_t size);
備注
void* 表示未確定類型的指針,void *可以指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什麼類型的數據(比如是char還是int或者...)
3與new的區別編輯
從本質上來說,malloc(Linux上具體實現可以參考man malloc,glibc通過brk()&mmap()實現)是libc裡面實現的一個函數,如果在source code中沒有直接或者間接include過stdlib.h,那麼gcc就會報出error:『malloc』 was not declared in this scope。如果生成了目標文件(假定動態鏈接malloc),如果運行平台上沒有libc(Linux平台,手動指定LD_LIBRARY_PATH到一個空目錄即可),或者libc中沒有malloc函數,那麼會在運行時(Run-time)出錯。new則不然,是c++的關鍵字,它本身不是函數。new不依賴於頭文件,c++編譯器就可以把new編譯成目標代碼(g++4.6.3會向目標中插入_Znwm這個函數,另外,編譯器還會根據參數的類型,插入相應的構造函數)。
在使用上,malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。比如:
int*p;
p=new int;
//返回類型為int*類型(整數型指針),分配大小為sizeof(int)
或:
int*parr;
parr=new int[100];
//返回類型為int*類型(整數型指針),分配大小為sizeof(int)*100;
而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際類型的指針。
int*p;
p=(int*)malloc(sizeof(int)*128);
//分配128個(可根據實際需要替換該數值)整型存儲單元,
//並將這128個連續的整型存儲單元的首地址存儲到指針變數p中
double*pd=(double*)malloc(sizeof(double)*12);
//分配12個double型存儲單元,
//並將首地址存儲到指針變數pd中
第一、malloc 函數返回的是 void * 類型。對於C++,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。所以必須通過 (int *) 來將強制轉換。而對於C,沒有這個要求,但為了使C程序更方便的移植到C++中來,建議養成強制轉換的習慣。
第二、函數的實參為 sizeof(int) ,用於指明一個整型數據需要的大小。
在Linux中可以有這樣:malloc(0),這是因為Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的;
但是在某些系統中是不允許malloc(0)的。在規范的程序中我們有必要按照這樣的格式去使用malloc及free:
type*p;
if(NULL==(p=(type*)malloc(sizeof(type))))
/*請使用if來判斷,這是有必要的*/
{
perror("error...");
exit(1);
}
.../*其它代碼*/
free(p);
p=NULL;/*請加上這句*/
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
比如想分配100個int類型的空間:
int*p=(int*)malloc(sizeof(int)*100);
//分配可以放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
對其做一個特例補充
char*ptr;
if((ptr=(char*)malloc(0))==NULL)
puts("Gotanullpointer");
else
puts("Gotavalidpointer");
此時得到的是Got a valid pointer。把0賦給malloc能得到一個合法的指針。
4工作機制編輯
malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最後,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閑鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閑鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合並成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。
Linux Libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合並成為一個較大的free空間。
5程序示例編輯
正常程序
typedef struct data_type{
intage;
charname[20];
}data;
data*bob=NULL;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL)
{
bob->age=22;
strcpy(bob->name,"Robert");
printf("%sis%dyearsold\n",bob->name,bob->age);
}
else
{
printf("mallocerror!\n");
exit(-1);
}
free(bob);
bob=NULL;
內存泄漏實例
例1:
#include<stdio.h>
#include<malloc.h>
#defineMAX100000000
intmain(void)
{
int*a[MAX]={NULL};
inti;
for(i=0;i<MAX;i++){
a[i]=(int*)malloc(MAX);
}
return0;
}
例2:
#include"stdio.h"
#include"malloc.h"//malloc()函數被包含在malloc.h裡面
int main(void)
{
char*a=NULL;//聲明一個指向a的char*類型的指針
a=(char*)malloc(100*sizeof(char));//使用malloc分配內存的首地址,然後賦值給a
if(!a)//如果malloc失敗,可以得到一些log
{
perror("malloc");
return-1;
}
sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"寫入a指向的地址
printf("%s\n",a);//輸出用戶輸入的數據
free(a);//釋放掉使用的內存地址
return0;//例2有無內存泄露?
}
例1:對malloc申請之後沒有檢測返回值;
例2:檢測malloc返回值條件有誤。
⑹ linux下malloc最多可以分配多大的
malloc分配內存是在堆裡面獲取內存區域的,屬於用戶數據段的,需要自己手動free掉。用戶數據段最大3G的內存空間
⑺ 在linux中,一個進程可以malloc1g的空間嗎
應該不可以。 windows上的exe文件都是pe格式,PE格式中默認堆和棧的大小都是1MB,同樣 linux上的可執行文件格式是ELF格式,這個我不太清楚,但是應該也有默認大小 。。不過這個可以在設置鏈接參數來設置
⑻ linux是不是對過多的malloc有限制
每個系統對此都有限制。
你的動態分配空間是在堆里,
而每個進程的堆大小是一定的。
⑼ Linux C語言 malloc 函數
Queue的定義在哪
要轉換類型 = (*類型)malloc(sizeof(類型))
⑽ linux malloc 100m內存後,發現減少了108m,為什麼會出現這種情況怎樣才能精確分配到指定大小的內存
內存對齊的問題,malloc分配內存是按頁分配的,事實上你分配了100M,程序可用的也就是100M,但是佔用了108M,這個不影響程序的。