2012-09-18 114 views
-2

我遇到了一個採訪問題,他們要求在C++中實現malloc()和free函數。在C++中定製實現malloc

最初聲明50000大小的char數組(50000字節)。假設這是堆內存,請編寫malloc和free函數來分配內存塊並釋放內存。

任何人都可以提供給我C++工作/僞代碼或只是解釋機制? (顯然,代碼會使它更容易理解)。

感謝, 羅希特

+0

我認爲這太寬泛了,分配器太大而不適合答案,並且基礎知識[很容易在維基百科上獲得](http://en.wikipedia.org/wiki/Memory_management#Dynamic_memory_allocation),所以添加他們在這裏價值很低。 – unwind

+2

我認爲面試問題背後的想法是讓你考慮如何管理自己的記憶,以及如何跟蹤使用什麼和未使用的內容。努力! –

+2

請更具體地說明你卡在哪裏。 –

回答

-4

我沒有測試,但我認爲這是可能通過使用new關鍵字和模板,支持通用的狀態來創建所需類型的數組, 要做到這一點,但我會跟隨這個問題找出C++英雄的反應。

+4

我認爲使用'new'不是解決方案。 – Dani

+0

使用new創建malloc? – UmNyobe

6

雖然編寫生產級動態內存分配器是一項非常艱鉅的任務,編寫玩具很簡單。這個問題顯然是爲了測試你的技能,但在別人的作品中尋找靈感還是公平的。

「The C Programming Language」by Kernighan & Ritchie contains a simple implementation of malloc。研究它並考慮其設計和實施的含義。考慮如何改進它以更好地執行,減少片段或處理多個線程。之後,編寫自己的玩具分配器不再困難,並且回答出現的任何問題。

2

有幾種不同的算法可以使用。對於這樣一個小內存,我只是在每個塊的前面加上一個指向下一個 塊的指針,並在其中指明是否分配或釋放該塊。一個 分配包括找到一個足夠大的空閒塊,必要時將其分割爲 ,並將返回的塊標記爲已分配。免費的 包括標記爲免費的塊。在某些時候,您還必須 合併塊:如果兩個空閒塊相互跟隨,則合併爲 合併成一個塊。 (我在執行過程中在分配過程中這樣做了。)

上面的算法本身並不是很困難。真正的伎倆是 獲得所有不同的演員和這樣的權利。這是一個很好的練習 在非常低的水平編程。