*** 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);