unique_ptrを以下のような外部関数へ直接渡す方法を知りたいです。
unique_ptr型から生ポインタを引数としている関数を呼び出したかったのですが、getメソッドを使って渡すと、以下のエラーが出力されました。
- getメソッド利用
cpp
1// 動かない 11/20 訂正 2 std::unique_ptr<wchar_t> sjis_to_utf16(const std::string str) { 3 const int wchar_len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); 4 std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len)); 5 ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, utf16_str.get(), wchar_len); 6 return std::move(utf16_str); 7 }
- エラー
Debug Error! Program:***.exe HEAP CORRUPTION DCETECTED: after Normal block at (アドレス) CRT detected that the application wrote to memory after end of heap buffer.
また、先にunique_ptrの要領のみを定義してから生ポインタにgetメソッドの返り値を入れて外部関数に渡しても同様のエラーが発生しました。
- 生ポインタを使用すれば、動くことは確認できております。
cpp
1 2// 動く 3 std::unique_ptr<wchar_t> sjis_to_utf16(const std::string str) { 4 const int wchar_len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); 5 wchar_t* p_utf16_str = new wchar_t[wchar_len]; 6 ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, p_utf16_str, wchar_len); 7 std::unique_ptr<wchar_t> utf16_str(p_utf16_str); 8 return std::move(utf16_str); 9 }
- 追記 11/20
自作した関数に.getメソッドで渡すと、正常に動作しているようでした。
MultiByteToWideChar()
側に問題があるのかもしれません。
型の違いが原因である気がしてきました…
MultiByteToWideCharのリファレンス
int MultiByteToWideChar( UINT CodePage, // コードページ DWORD dwFlags, // 文字の種類を指定するフラグ LPCSTR lpMultiByteStr, // マップ元文字列のアドレス int cchMultiByte, // マップ元文字列のバイト数 LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス int cchWideChar // バッファのサイズ );```
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/20 06:21 編集
2016/11/20 07:08