2014-05-12 65 views
1

我有一個面試機會,我提出以下問題:完善的免費功能 - 面試

free()功能實在是太「貴」。我們想要實現一個功能 ,其名稱爲myFree(),原型爲void myFree(void* p)myFree需要以某種方式保存指針p,而不是free()函數會執行的操作。

此刻,當程序員決定釋放他保存由myFree函數指針,他使用的功能myFinalFree()

我只有一個全局指針,我可以在執行myFree時使用,因此我無法分配任何額外的內存。

任何想法myFree

+0

您必須對問題更加具體。 – this

+1

最明顯的解決方案是從釋放的內存中組織鏈接列表。可能哪裏更有趣的解決方案? – alexander

+0

我不能更具體。 鏈接列表的問題是,你「丟失」該對象的指針被引用到 –

回答

3

您可以管理鏈表指針:

  • 初始化的全局head=0
  • 內部功能myFree(p)
    1. 設置的地址值由p指着值head
    2. 將值head設置爲值p
  • 內部功能myFinalFree()
    1. 開始從head,並釋放所有的指針,直至達到0
    2. 設置的head值回0

這裏是一個編碼例如:

typedef int t_ptr; 

static t_ptr head = 0; 

void myFree(void* p) 
{ 
    if (p) 
    { 
     *(t_ptr*)p = head; 
     head = (t_ptr)p; 
    } 
} 

void myFinalFree() 
{ 
    t_ptr* p = (t_ptr*)head; 
    while (p) 
    { 
     head = *p; 
     free(p); 
     p = (t_ptr*)head; 
    } 
} 

注:

  • 你必須確保sizeof(t_ptr) == sizeof(void*)
  • 上面的代碼假設malloc總是分配至少sizeof(void*)字節下工作,對準這是一個倍數的地址sizeof(void*)
+0

在用戶試圖釋放比指針小的內存塊的情況下,不會出現這種段錯誤嗎?另外我認爲在大多數情況下,'sizeof(size_t)== sizeof(void *)'。 – SimpleJ

+0

之前調用myfree p指向一個對象... 後myfree p指向頭... 它是一個問題,而免費(p)在myFinalFree? –

+0

@SimpleJ:'malloc'通常分配最小的sizeof(void *)個字節,並對齊到sizeof(void *)的倍數。所以你可以調用'malloc(1)',但實際上至少會分配4或8個字節。 –