記憶體原理 總結

2021-10-16 10:22:40 字數 1379 閱讀 8911

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶

呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。

呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。

到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。

總結:通過malloc的工作機制可以看出,在分配堆記憶體空間時,malloc會自己管理乙個鍊錶用來維護堆中的記憶體(這種維護可以管理記憶體碎片,可以提高記憶體的利用率),由於malloc通過鍊錶來維護,就必不可少的會利用空間來存放next指標域,這個next指標域就緊緊的挨在malloc分配的記憶體的後面。

影響/問題:在遇到了使用malloc()分配記憶體後,如果發生記憶體指標越界,則會導致下次使用malloc()分配記憶體失敗的後果。所以,如果越界訪問malloc分配的記憶體空間,就會破壞next域,從而破壞了鍊錶結構,因此下一次再呼叫malloc分配記憶體時就會失敗。

示例:因此有的時候,如果malloc函式申請記憶體失敗,返回了空值0,則問題可能不是由於記憶體不夠用了,而是因為在前面的程式**現了記憶體的越界訪問!不只是由於可能使用了memset、memcpy等函式進行了越界訪問,也有可能是以指標陣列的形式進行了越界訪問,導致malloc函式返回0.

比如: 

1. char * a=(char *)malloc(100);

2.3. char * b=(char *)malloc(100);

當在以上第1行語句與第3行語句之間出現了以下任何一條類似越界訪問的語句,都有可能導致第3行中b得到值為0。

如:

memset(a,0,101);

memcpy(a,c,101);

a[101]=1;

*(a+101)=1;

參考文章:

DRAM 記憶體原理

rom read only memory 唯讀儲存器。斷電後資訊不丟失,如計算機啟動用的bios晶元。訪問速度很低,較ram而言 且不能改寫。由於不能改寫資訊,不能公升級,現已很少使用。ram ramdom access memory 易揮發性隨機訪問儲存器,高速訪問,讀寫時間相等,且與位址無關,如...

記憶體對齊原理

相信絕大多數的人都了解記憶體對齊,對齊後效能高。但是其最最底層的原理是啥呢?有的人可能會說,因為快取記憶體的工作機制。讀者你很聰明,這是原因之一。但我今天想挖的是更底層一點的原理,讓我們去記憶體的物理構成裡找找答案!乙個記憶體是由若干個黑色的記憶體顆粒構成的。每乙個記憶體顆粒叫做乙個chip。每個c...

記憶體對齊原理

記憶體對齊的原則 資料成員對 規則 結構 struct 或聯合 union 的資料成員,第 乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要 從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體等 的整數倍開始 比如int為4位元組,則要從4的整數倍位址...