2012-03-21 74 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