2011-08-02 64 views
3

我正在接收臭名昭着的“释放释放后释放的堆块”有关data =(LPBYTE)malloc(MAX_VALUE_DATA);的消息。 This stackoverflow thread suggests这是因为我错误地释放了一些东西。事实上,如果底部附近的空闲(数据)未被注释掉,这个错误将会返回,如果它被注释掉 - 就会消失。我怎么解决它错了?释放后释放的自由堆块

// Enumerate the key values. 

     if (cValues) 
     { 
      printf("\nNumber of values: %d\n", cValues); 
      LPBYTE data;    
      DWORD size; 
      data=(LPBYTE) malloc(MAX_VALUE_DATA); 
      messageProvider mp={(TCHAR*) currentRoot,NULL,NULL,NULL}; 
      BOOL anyGoodValues=FALSE; 
      for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
      { 
       cchValue = MAX_VALUE_NAME; 
       achValue[0] = '\0'; 
       ZeroMemory(data,MAX_VALUE_DATA); 
       //data=(LPBYTE) malloc(MAX_VALUE_DATA); 
       size=MAX_VALUE_DATA; 
       retCode = RegEnumValue(hKey, i, 
        achValue, 
        &cchValue, 
        NULL, 
        NULL, 
        data, 
        &size); 

       if (retCode == ERROR_SUCCESS) 
       { 
        _tprintf(TEXT("(%d) '%s'\n"), i+1, achValue); 
        BOOL valFound=FALSE; 
        if (_tcscmp(achValue,_T("ParameterMessageFile")) == 0){ 

         mp.ParameterMessageFile=(TCHAR *)data; 
         anyGoodValues=TRUE; 
         valFound=TRUE; 
        } 
        if (_tcscmp(achValue,_T("CategoryMessageFile")) == 0){ 

         mp.CategoryMessageFile=(TCHAR *)data; 
         anyGoodValues=TRUE; 
         valFound=TRUE; 
        } 
        if (_tcscmp(achValue,_T("EventMessageFile")) == 0){ 
         mp.ParameterMessageFile=(TCHAR *)data;   
         anyGoodValues=TRUE; 
         valFound=TRUE; 
        } 
        if(!valFound){ 
         //free(data); 
        } 
       } 

      } 
      if(anyGoodValues)    
       mpArray[mpIndex++]=mp;  
     } 
+1

当你移动你的malloc循环外,您在无牵无挂。免费移出。你不想在循环中反复使用malloc/free。这是非常低效的。 –

回答

7

您分配一次,但在循环内部空闲。在将来,如果您在调用free()之后始终将您的指针设置为NULL,那么将更容易找到此类事物。

2

您需要将free()函数移到循环外;在循环的下一次迭代中,RegEnumValue在释放后使用数据。