释放后修改的自由堆块

时间:2011-08-02 16:08:58

标签: c

我在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;      
        }

3 个答案:

答案 0 :(得分:7)

你分配一次,但在循环中自由。将来,如果您在调用NULL之后始终将指针设置为free(),则会更容易找到此类内容。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

验证/ Zp编译器选项的“默认”值(C / C ++代码生成中的“struct member alignment”) 在您的代码和所有库中。

有关说明,请参阅:https://stackoverflow.com/a/14444115/1997864