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

回答編集履歴

1

std::unique_ptr<T>とstd::unique_ptr<T\[\]>の違い

2016/11/20 06:20

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -38,4 +38,15 @@
38
38
 
39
39
  とりあえず、strlenやstrcpyなどは動いているのでたぶん何でもいけるでしょう。`char[]`だと扱いにくそうなので`std::string`を返す例も作ってみました。`std::make_unique`はC++14からなので古いコンパイルにはご注意ください。
40
40
 
41
- あと、returnの所に`std::move`がなくてもムーブになると思っているんですが、必要でしたっけ?
41
+ あと、returnの所に`std::move`がなくてもムーブになると思っているんですが、必要でしたっけ?
42
+
43
+ ---
44
+ 【追記】
45
+
46
+ [unique_ptr - cpprefjp C++日本語リファレンス](http://cpprefjp.github.io/reference/memory/unique_ptr.html)によると
47
+
48
+ > `new[]`演算子で作成された配列へのポインタにも対応している。
49
+ > * `T[]`時に`delete[]`を呼び出すように`default_delete`を特殊化している。`auto_ptr`では配列を渡すことができなかった(正確にはデストラクタで`delete[]`ではなく`delete`が呼び出されるため上手く動作しない)。
50
+ > * `unique_ptr`自体も`T[]`時には部分特殊化され、`operator[]`によるアクセスを提供している。
51
+
52
+ だそうです。`std::unique_ptr<wchar_t>`のままでも`operator[]`を使わなければ動くようですが、ポインタが破棄されるときに問題が起きるかも知れません。