& quot; Обнаружено повреждение кучи & quot; при передаче указателя на функцию, затем вызывая free () для указателя

Visual Studio 2010

Когда я выделяю память для строки символов, передаю строку (указатель) в функцию, затем пытаюсь освободить память, я получаю «Обнаружено повреждение кучи» ошибка выполнения.

я подозреваемый это результат того, что функция, помечающая память как «освобожденную», как только она возвращается, но я все еще озадачена тем, как обойти это. Я не чувствую себя комфортно, просто убирая звонок бесплатно ().

// this function takes a char string, converts it to a wide char string,
// then passes the converted string to another function.
void Class::WriteToLog(const char * msg)
{
// allocate memory
wchar_t * wMsg = (wchar_t*)malloc((strlen(msg) * sizeof(wchar_t)) + 1); // add one for null terminating char
// convert to wide char. This works fine, and returns 4 when msg is 4 chars long.
numChar = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, msg, strlen(msg), wMsg, strlen(msg));

wMsg[numChar] = L'\0'; // terminate string
// At this point wMsg contains the same thing msg contains. Works fine.
WriteToLogW(wMsg); // Works fine. Writes the string to a text file.
free(wMsg); // Heap Corruption Detected
}void Class::WriteToLogW(const wchar_t * msg)
{
...
}

0

Решение

+1 Вы добавили в конце вашего malloc только выделит достаточно памяти для нулевого терминатора при работе с charс, как chars — 1 байт (и, следовательно, нулевой терминатор займет один байт).

Так как вы используете wchar_t, нулевой терминатор примет sizeof(wchar_t) байтов, которые практически всегда будут больше 1. Следовательно, malloc вызов выделяет недостаточно памяти. Перестройте свой malloc позвоните, чтобы выглядеть так:

wchar_t * wMsg = (wchar_t*) malloc((strlen(msg) + 1) * (sizeof(wchar_t));

Таким образом, общее количество выделенных байтов оставляет место для нулевого терминатора.

2

Другие решения

Даже завершающий nul строки широких символов является широким, поэтому недостаточно дать ему только один байт. Изменить:

wchar_t * wMsg = (wchar_t*)malloc((strlen(msg) * sizeof(wchar_t)) + 1);

в

wchar_t * wMsg = (wchar_t*)malloc((strlen(msg) + 1) * sizeof(wchar_t));
2