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)
{
...
}
+1
Вы добавили в конце вашего malloc
только выделит достаточно памяти для нулевого терминатора при работе с char
с, как char
s — 1 байт (и, следовательно, нулевой терминатор займет один байт).
Так как вы используете wchar_t
, нулевой терминатор примет sizeof(wchar_t)
байтов, которые практически всегда будут больше 1. Следовательно, malloc
вызов выделяет недостаточно памяти. Перестройте свой malloc
позвоните, чтобы выглядеть так:
wchar_t * wMsg = (wchar_t*) malloc((strlen(msg) + 1) * (sizeof(wchar_t));
Таким образом, общее количество выделенных байтов оставляет место для нулевого терминатора.
Даже завершающий 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));