2011-08-02 102 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在釋放後使用數據。