寫在前面:小生純業餘選手,開此博僅僅是爲了積累,純當筆記來用。如有看官光臨小生博客,請不要相信我的代碼就是正確的。如果您發現了錯誤也懇請耽誤您一點時間,請您在下面指出來,不勝感激!
如果發現一些筆記的說法完全是錯誤的請建議我刪除!
malloc分配堆內存空間,malloc自己管理一個鏈表用來維護堆中的內存(這種維護可以管理內存碎片,可以提高內存的利用率),由於malloc通過鏈表來維護,就必不可少的會利用空間來存放next指針域,這個next指針域就緊緊的挨着malloc分配的內存的後面,如果越界訪問malloc分配的內存空間就會破壞next域,從而破壞了鏈表結構於是就會Abort!
通過程序驗證
<pre name="code" class="cpp">#include<iostream>
#include<cstdlib>
#include<unistd.h>
using namespace std;
int main()
{
int *p = static_cast<int *>(malloc(4));
int *pp = static_cast<int *>(malloc(4));
*p = 1;
// *(p+1) = 2;
// *(p+2) = 3;
// *(p+3) = 4;
*(p+5) = 2;
*(p+6) = 3;
*(p+7) = 4;
cout << "*p = " << *p <<endl;
cout << "*(p+1) = "<< *(p+1) <<endl;
cout << "*pp = "<< *pp <<endl;
cout <<"*(pp+1) = "<< *(pp+1)<< endl;
free(p);
p = NULL;
// cout<<"(*p) = "<<*p<<endl;
return 0;
}
如果去掉前三個註釋符中的任意一個,程序就會被中止,可以看出malloc確實在被分配的內存的後面存放了一些用於維護內存的信息,如果被破壞程序就會中止。
問題:
*malloc分配得到的內存一定需要被free嗎?*free掉的指針就一定不能被訪問了嗎?
*如果說只有被映射的邏輯地址(虛擬地址)才能被訪問,那麼*(p+4),*(p+5)這樣的訪問不會報錯?