*** glibc detected *** [沒事寫寫Bug]


*** glibc detected ***

         其實看到上述字眼大家都很煩,我也很煩,今天閑着沒事,寫寫Bug,混個眼熟,下回見面可以打個招呼把它送走~

extern void *realloc(void *mem_address, unsigned int newsize);

先判斷當前的指針是否有足夠的連續空間,如果有,擴大mem_address指向的地址,並且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有數據從頭到尾拷貝到新分配的內存區域,而后釋放原來mem_address所指內存區域,同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址。

1.double free

         這說的是一個地址被free了兩次,很容易查出來。

代碼:

int *a = (int*)malloc(sizeof(int)*1);

free(a);

free(a);//這里就報錯了

2. invalid pointer

這里是說,a+1不是連續地址的頭部。

*** glibc detected *** ./main_test-g: realloc(): invalid pointer: 0x09e30fb4 ***

int *a = (int*)malloc(sizeof(int)*4);

a = (int*)realloc(a+1,sizeof(int)*2);

同樣,我在后面加一句

free(a+1);

他就會報錯如下:

*** glibc detected *** ./main_test-g: free(): invalid pointer: 0x09fc8fb4 ***

 

在往下進行之前,我們先來一段小插曲。

int *a = (int*)malloc(sizeof(int*)*1);

int *b = (int*)malloc(sizeof(int*)*1);

cout<<a<<","<<b<<endl;

a[4] = 1;

cout<<b[0]<<endl;(其實a[4]就是b[0])

你看到輸出結果了嗎?ab的地址正好差了16,呵呵,這說明什么,malloc分配地址是有策略的,為什么不連着分配?因為你之后可能realloc,如果realloc增加超過16那么就會全部釋放然后拷貝到下一片連續的內存,所以需要一個折中的取法,16可以了,說道這里,壞壞的你一定知道如何寫一個Bug了。。來看看這個Bug有多奇妙~

3 double free or corruption

*** glibc detected *** ./main_test-g: double free or corruption (fasttop): 0x09793fb0 ***

代碼:

int *a = (int*)malloc(sizeof(int*)*1);

int *b = a;

int *c = (int*)malloc(sizeof(int*)*1);

a =(int*)realloc(a,sizeof(int*)*5);//a的值已經變化了,倘若你把5換成2,沒准就沒事了。。

b =(int*)realloc(b,sizeof(int*)*5);

你可能覺得這種代碼不常見,但是多線程時一定要注意,作為參數傳來傳去的地址很可能被別的地址偷走了內存!

 

 

int *a = (int*)malloc(sizeof(int*)*4);

a[5] = 1;cout<<&a[5]<<endl;

int *b = (int*)malloc(sizeof(int*)*4);

 

*** glibc detected *** ./main_test-g: realloc(): invalid next size: 0x086b5fb0 ***

int *a = (int*)malloc(sizeof(int*)*4);

a[5] = 1;cout<<&a[5]<<endl;

a = (int*)realloc(a,sizeof(int*)*10);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM