お世話になります。
先日、AnsiからUnicodeへの変換についておしえていただきました。
変換自体は、思うとおりに出来たのですが、その後メモリのクリアが出来なくて
行き詰まってしまいした。
コードは下記のようなものです。
scrには、"ID"を渡しています。
char* str = new char[len + 2];
strcpy(str, scr);
*(str + len) = '\n';
*(str + len + 1) = '\0';
int nn = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
wchar_t* pUnicode = new wchar_t( nn );
::MultiByteToWideChar(CP_ACP, NULL, str, -1, pUnicode, nn);
delete [] pUnicode; <-ここでメモリリークを起こします
delete [] str;
pUnicodeはつぎの通り
0x0069
0x0064
0x000a
0x0000
エラー内容はつぎの通りです
memory check error at 0x00513052 = 0x64, should be 0xFD.
memory check error at 0x00513053 = 0x00, should be 0xFD.
memory check error at 0x00513054 = 0x0A, should be 0xFD.
memory check error at 0x00513055 = 0x00, should be 0xFD.
このエラーに引っかかって進めなくなってしまいました。
よろしく、お願い致します。
× new wchar_t( nn );
○ new wchar_t[ nn ];
※ ただしnnは文字数+1
ところでそれは"メモリのクリア"ではありません、"メモリの解放"です。
文字数+1 は \0 分を含んでという趣旨と思うんだけど
strlen (_tcslen) の返却値+1 ということならまったくもって御意。
でもこの例のように MultiByteToWideChar において cchMultiByte = -1 を指定した場合
返却値には \0 を含む文字数が返されるので new wchar_t [nn] でいいと思う。
そーなんだー。フォローありがとです。
επιστημηさま tetrapodさま
ご指導有難うございました。
ずっと、にらめっこしてたんですが、こんなところが違ったとは
やっと、スッキリできました。
ありがとうございました。
ツイート | ![]() |