释放后修改的自由堆块

Kon*_*ads 3 c

我在data =(LPBYTE)malloc(MAX_VALUE_DATA);上收到臭名昭着的"释放后修改的免费堆块"消息.这个stackoverflow线程表明这是因为我正在释放错误的东西.事实上,如果底部附近的自由(数据)被取消注释,则此错误将返回,如果被注释,则会消失.我如何解决它错了?

// 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;      
        }
Run Code Online (Sandbox Code Playgroud)

nmi*_*els 7

你分配一次,但在循环中自由.在将来,如果你总是NULL在调用free()它们之后设置指针,那么这种事情会更容易找到.