2012-03-21 24 views
0

有兩個問題:如何清除C中的結構數組,然後釋放該內存?

  1. 如何快速清除結構數組?
  2. 如何釋放由結構成員分配的內存?

代碼:

struct sComputerNames 
{ 
    TCHAR *sName; // Using a pointer here to minimize stack memory. 
}; 

TCHAR *sComputer = (TCHAR *) calloc(2048+1, sizeof(TCHAR)); 
struct sComputerNames sCN[4096] = {0}; 


_tcscpy(sComputer,L"PC1"); 
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR)); 
_tcscpy_s(sCN[0].sName,128,sComputer); 


// What is a better way to clear out the structure array? 
for (DWORD i=0;i<4096;i++) 
{ 
    free(sCN[i].sName); 
    sCN[i].sName=NULL; 
} 


// Assign a new value 
_tcscpy(sComputer,L"PC2"); 
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR)); 
_tcscpy_s(sCN[0].sName,128,sComputer); 


free(sCN);sCN=NULL;  // Erroring here - how to free memory allocated by sCN's members? 
free(sComputer);sComputer=NULL; 

謝謝!

+0

free(sCN); sCN = NULL; sCN在堆棧內存上。所以你不能釋放它。你必須按照你所做的來釋放mem的成員來完成循環。如果你想在一段時間後重新分配,那麼最好重用相同的緩衝區。保留一個表示緩衝區「正在使用」,「空閒」或「需要分配」的標誌。 – 2012-03-21 12:15:55

+0

我認爲這是爲結構分配內存的正確方法 - 使用成員指針而不是爲成員分配內存(即4096 * 128)? – JeffR 2012-03-21 12:49:20

回答

1

清除磁盤陣列易於:

memset(sCN, 0, sizeof(sCN)); 

至於其他的,你有關於設法釋放SCN你沒有的malloc(),並試圖釋放大量的名字有些迷茫時,你只calloc()'其中之一。

+0

好的,謝謝你。現在我只需要釋放由sName成員分配的內存。看起來我必須循環? – JeffR 2012-03-21 12:42:30

+0

循環的唯一原因是它產生更緊密的代碼。無論原因是什麼,循環訪問數組都是有意義的。 – octopusgrabbus 2012-03-21 14:33:30

0

您試圖從結構頭中解放出來,但它不是指針,如果它是 ,那麼您仍然需要首先釋放sName指針的內存。

您可以免費sCN [idx] .sName - 其中idx將由for循環分配。如果您想將結構清零 - 您的問題不清楚 - 使用sCN [idx]調用memset作爲 的起始地址,0作爲設置值,sizeof(sCN [idx])作爲結構的長度。

您還需要釋放sComputer的內存。

+0

所以清楚是memset;免費是一個do循環? – JeffR 2012-03-21 12:43:22

+0

你不必有一個do循環來釋放,但是如果你有一個結構數組並且每個結構都有一個指針,釋放指針可以用for或while來完成,但是free和for循環不是依賴的彼此。 – octopusgrabbus 2012-03-21 12:53:54

+0

你能舉一個例子說明釋放指針嗎? – JeffR 2012-03-21 14:25:34

0

雖然有些庫有heap_min或其他名稱,這將重置m/calloc和free使用的分配池,但您做得非常正確。

請記住,分配池通常使用鏈接的分配信息節點列表實現。在你的例子中,會有一連串callocs的卡車載入,因此你釋放的順序應該與你分配的順序相同。這意味着免費通話將在鏈接列表的開頭找到空閒的元素,從而最大限度地縮短搜索時間。

+0

我沒有通過你的代碼來評估其他最終的錯誤 – jpinto3912 2012-03-21 12:06:12