我在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;
}
答案 0 :(得分:7)
你分配一次,但在循环中自由。将来,如果您在调用NULL
之后始终将指针设置为free()
,则会更容易找到此类内容。
答案 1 :(得分:2)
你需要在循环外移动free();在循环的下一次迭代中,RegEnumValue在释放后使用数据。
答案 2 :(得分:0)
验证/ Zp编译器选项的“默认”值(C / C ++代码生成中的“struct member alignment”) 在您的代码和所有库中。