Обнаружена ошибка кучи при попытке освободить указатель - PullRequest
1 голос
/ 24 декабря 2010

Я довольно новичок в C ++ и столкнулся с проблемой, которую мне не удалось решить.Я пытаюсь преобразовать System :: String в указатель wchar_t, который я могу хранить дольше, чем область действия функции.Как только я закончу с этим, я хочу очистить его должным образом.Вот мой код:

static wchar_t* g_msg;

void TestConvert()
{
    pin_ptr<const wchar_t> wchptr = PtrToStringChars("Test");
    g_msg = (wchar_t*)realloc(g_msg, wcslen(wchptr) + 1);
    wcscpy(g_msg, wchptr);

    free (g_msg); // Will be called from a different method
}

Когда вызывается бесплатный, я получаю сообщение «ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после блока Normal (# 137) в 0x02198F90».получить эту ошибку?

Andrew L

Ответы [ 2 ]

4 голосов
/ 24 декабря 2010

Я думаю, вы выделяете слишком маленький блок памяти для строки. Каждый символ занимает 2 байта (в MSVC), потому что это широкая строка:

g_msg = (wchar_t*)realloc(g_msg, (wcslen(wchptr) + 1)*sizeof(wchar_t));
0 голосов
/ 24 декабря 2010

System :: String - это класс управляемых строк, а не класс C ++. Вам нужно преобразовать в std :: wstring, которая управляет собственной памятью, а не в const

...