блок свободной кучи изменен после освобождения - PullRequest
3 голосов
/ 02 августа 2011

Я получаю пресловутый «блок свободной кучи, измененный после его освобождения» сообщение с данными = (LPBYTE) malloc (MAX_VALUE_DATA) ;. Этот поток в стеке предлагает , потому что я освобождаю что-то неправильно. И действительно, если свободное (данные) внизу не прокомментировано, эта ошибка возвращается, а если она прокомментирована - исчезает. Как я освобождаю это неправильно?

// 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 ]

7 голосов
/ 02 августа 2011

Вы выделяете один раз, но бесплатно внутри цикла. В будущем подобного рода вещи будет легче найти, если вы всегда устанавливаете свои указатели на NULL после вызова free() для них.

2 голосов
/ 02 августа 2011

Вам нужно переместить free () за пределы цикла; на следующей итерации цикла RegEnumValue использует данные после их освобождения.

0 голосов
/ 21 января 2013

Проверьте значение «по умолчанию» для параметра компилятора / Zp («выравнивание членов структуры» при генерации кода C / C ++) в вашем коде и во всех библиотеках.

Объяснение см .: https://stackoverflow.com/a/14444115/1997864

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...