teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

微修正

2016/11/20 07:16

投稿

Chironian
Chironian

スコア23274

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

追記

2016/11/20 07:16

投稿

Chironian
Chironian

スコア23274

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

追記

2016/11/20 07:12

投稿

Chironian
Chironian

スコア23274

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
+ > テスト