int gb2Utf8(const char* source, int sourceLen, void *target, int targetLen)
{
int result = 0;
int bufLen = strlen(source) * 2;
wchar_t *buffer = (wchar_t *)malloc(bufLen);
if (!buffer)
{
result = 1;
goto RETURN;
}
//GB18030 code page: 54936
int m2wResult = MultiByteToWideChar(54936, MB_ERR_INVALID_CHARS, source, -1, buffer, bufLen);
if (!m2wResult)
{
result = 2;
goto RETURN;
}
int w2mResult = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, buffer, -1, (char *)target, targetLen, NULL, NULL);
if (!w2mResult)
{
result = 3;
goto RETURN;
}
RETURN:
free(buffer);
return result;
}
プログラムを実行するfree(buffer)
とクラッシュしますが、理由はわかりません。定数値に
変更したり、関数を削除したりしても、クラッシュすることはありません。理由もわかりません。これは、クラッシュ時のコールスタックです。bufLen
MultiByteToWideChar
msvcr100d.dll!_free_dbg_nolock(void * pUserData、int nBlockUse)1376行目+0x3bバイトC++
msvcr100d.dll!_free_dbg(void * pUserData、int nBlockUse)1265行目+0xdバイトC++
msvcr100d.dll!free(void * pUserData)49行目+0xbバイトC++
New.exe!gb2Utf8(const char * source、int sourceLen、void * target、int targetLen)156行目+0xcバイトC++
New.exe!wWinMain(HINSTANCE__ * hInstance、HINSTANCE__ * hPrevInstance、wchar_t * lpCmdLine、int nCmdShow)29行目+0x11バイトC++
New.exe!__ tmainCRTStartup()547行目+0x2cバイト
CNew.exe!wWinMainCRTStartup()371行目C
kernel32.dll!7509339a()
[以下のフレームは正しくないか、欠落している可能性があります。 kernel32.dll用にロードされたシンボル]
ntdll.dll!77979ef2()
ntdll.dll!77979ec5()