爲什麼不能越界訪問malloc分配的內存

寫在前面:小生純業餘選手,開此博僅僅是爲了積累,純當筆記來用。如有看官光臨小生博客,請不要相信我的代碼就是正確的。如果您發現了錯誤也懇請耽誤您一點時間,請您在下面指出來,不勝感激!

如果發現一些筆記的說法完全是錯誤的請建議我刪除!


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)這樣的訪問不會報錯?

發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章