回答編集履歴
3
微修正
    
        answer	
    CHANGED
    
    | @@ -40,14 +40,14 @@ | |
| 40 40 | 
             
            【raccyさんの回答を見て追記】
         | 
| 41 41 | 
             
            配列を破棄する時は、deleteではなくdelete[]を呼ばないといけません。
         | 
| 42 42 | 
             
            std::unique_ptr<>のdefault_deleteはTを渡したら単にdeleteするだけのようです。
         | 
| 43 | 
            -
            [T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
         | 
| 43 | 
            +
            しかし、[T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
         | 
| 44 44 |  | 
| 45 45 | 
             
            ですので、
         | 
| 46 46 |  | 
| 47 47 | 
             
            誤> std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len));
         | 
| 48 48 | 
             
            正> std::unique_ptr<wchar_t[]> utf16_str(new wchar_t[wchar_len]);
         | 
| 49 49 |  | 
| 50 | 
            -
             | 
| 50 | 
            +
            と、しておくべきですね。
         | 
| 51 51 |  | 
| 52 52 | 
             
            因みにmsvcはdeleteとdelete[]の実装は同じだったと記憶してます。なので、msvcでは「たまたま」問題が起きなかったということになります。
         | 
| 53 53 |  | 
2
追記
    
        answer	
    CHANGED
    
    | @@ -35,3 +35,20 @@ | |
| 35 35 | 
             
            実行すると、下記のように表示されます。
         | 
| 36 36 |  | 
| 37 37 | 
             
            > テスト
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ---
         | 
| 40 | 
            +
            【raccyさんの回答を見て追記】
         | 
| 41 | 
            +
            配列を破棄する時は、deleteではなくdelete[]を呼ばないといけません。
         | 
| 42 | 
            +
            std::unique_ptr<>のdefault_deleteはTを渡したら単にdeleteするだけのようです。
         | 
| 43 | 
            +
            [T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            ですので、
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            誤> std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len));
         | 
| 48 | 
            +
            正> std::unique_ptr<wchar_t[]> utf16_str(new wchar_t[wchar_len]);
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            までやっておかないと危険ですね。
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            因みにmsvcはdeleteとdelete[]の実装は同じだったと記憶してます。なので、msvcでは「たまたま」問題が起きなかったということになります。
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            実はほとんど同じ処理を私のソフトでもやっていて、それと見比べていたのですが、自分のはしっかりwchar_t[]にしてました...見落としが多い。orz
         | 
1
追記
    
        answer	
    CHANGED
    
    | @@ -2,4 +2,36 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            「生ポインタを使用すれば、動くことは確認できております。」の使い方は正しいですよ。
         | 
| 4 4 |  | 
| 5 | 
            -
            また、「getメソッド利用」のソースはp_utf16_str未定義でコンパイルに通らないと思いますし、get()も使ってないのでソースを間違われているのではないかと思います。
         | 
| 5 | 
            +
            また、「getメソッド利用」のソースはp_utf16_str未定義でコンパイルに通らないと思いますし、get()も使ってないのでソースを間違われているのではないかと思います。
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ---
         | 
| 8 | 
            +
            【質問で訂正されたコードのお試し動作】
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ```C++
         | 
| 11 | 
            +
            #include <iostream>
         | 
| 12 | 
            +
            #include <string>
         | 
| 13 | 
            +
            #include <memory>
         | 
| 14 | 
            +
            #include <windows.h>
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              std::unique_ptr<wchar_t> sjis_to_utf16(const std::string str) {
         | 
| 17 | 
            +
                    const int wchar_len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
         | 
| 18 | 
            +
                    std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len));
         | 
| 19 | 
            +
                    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, utf16_str.get(), wchar_len);
         | 
| 20 | 
            +
                    return std::move(utf16_str);
         | 
| 21 | 
            +
                }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            int main()
         | 
| 24 | 
            +
            {
         | 
| 25 | 
            +
                std::unique_ptr<wchar_t>    utf16=sjis_to_utf16("テスト");
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                std::wcout.imbue(std::locale(""));
         | 
| 28 | 
            +
                std::wcout << utf16.get() << std::endl;
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                return 0;
         | 
| 31 | 
            +
            }
         | 
| 32 | 
            +
            ```
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            Visual Studio 2015でコマンド・プロンプトでビルドしました。
         | 
| 35 | 
            +
            実行すると、下記のように表示されます。
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            > テスト
         | 
