回答編集履歴

3

微修正

2016/11/20 07:16

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  std::unique_ptr<>のdefault_deleteはTを渡したら単にdeleteするだけのようです。
84
84
 
85
- [T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
85
+ しかし、[T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
86
86
 
87
87
 
88
88
 
@@ -96,7 +96,7 @@
96
96
 
97
97
 
98
98
 
99
- までやっておかないと危険ですね。
99
+ と、しておくべきですね。
100
100
 
101
101
 
102
102
 

2

追記

2016/11/20 07:16

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -73,3 +73,35 @@
73
73
  > テスト
74
74
 
75
75
 
76
+
77
+ ---
78
+
79
+ 【raccyさんの回答を見て追記】
80
+
81
+ 配列を破棄する時は、deleteではなくdelete[]を呼ばないといけません。
82
+
83
+ std::unique_ptr<>のdefault_deleteはTを渡したら単にdeleteするだけのようです。
84
+
85
+ [T[]を渡せば、delete[]を呼ぶよう特殊化されている](http://cpprefjp.github.io/reference/memory/default_delete.html)ようです。
86
+
87
+
88
+
89
+ ですので、
90
+
91
+
92
+
93
+ 誤> std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len));
94
+
95
+ 正> std::unique_ptr<wchar_t[]> utf16_str(new wchar_t[wchar_len]);
96
+
97
+
98
+
99
+ までやっておかないと危険ですね。
100
+
101
+
102
+
103
+ 因みにmsvcはdeleteとdelete[]の実装は同じだったと記憶してます。なので、msvcでは「たまたま」問題が起きなかったということになります。
104
+
105
+
106
+
107
+ 実はほとんど同じ処理を私のソフトでもやっていて、それと見比べていたのですが、自分のはしっかりwchar_t[]にしてました...見落としが多い。orz

1

追記

2016/11/20 07:12

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -7,3 +7,69 @@
7
7
 
8
8
 
9
9
  また、「getメソッド利用」のソースはp_utf16_str未定義でコンパイルに通らないと思いますし、get()も使ってないのでソースを間違われているのではないかと思います。
10
+
11
+
12
+
13
+ ---
14
+
15
+ 【質問で訂正されたコードのお試し動作】
16
+
17
+
18
+
19
+ ```C++
20
+
21
+ #include <iostream>
22
+
23
+ #include <string>
24
+
25
+ #include <memory>
26
+
27
+ #include <windows.h>
28
+
29
+
30
+
31
+ std::unique_ptr<wchar_t> sjis_to_utf16(const std::string str) {
32
+
33
+ const int wchar_len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
34
+
35
+ std::unique_ptr<wchar_t> utf16_str(new wchar_t(wchar_len));
36
+
37
+ ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, utf16_str.get(), wchar_len);
38
+
39
+ return std::move(utf16_str);
40
+
41
+ }
42
+
43
+
44
+
45
+ int main()
46
+
47
+ {
48
+
49
+ std::unique_ptr<wchar_t> utf16=sjis_to_utf16("テスト");
50
+
51
+
52
+
53
+ std::wcout.imbue(std::locale(""));
54
+
55
+ std::wcout << utf16.get() << std::endl;
56
+
57
+
58
+
59
+ return 0;
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+
67
+ Visual Studio 2015でコマンド・プロンプトでビルドしました。
68
+
69
+ 実行すると、下記のように表示されます。
70
+
71
+
72
+
73
+ > テスト
74
+
75
+