2012-12-25 17 views
6

私は答えを見つけることができません簡単なnoobの質問持っている:あなたは、通常のオブジェクトにへ変換オブジェクト:: unique_ptrを

int i; 

を変換しない方法をC++で

std::unique_ptr

std::unique_ptr<int> iptr = &i; //invalid 
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid 

ありがとうございます。

答えて

11

あなたはしません。そのオブジェクトはdeleteによって削除することはできません。これはunique_ptrが行うことです。あなたは私たちが標準をされている必要がありますが、残念ながら見落とされたmake_sharedと同じ効用関数としてmake_uniqueを定義し、ここで

auto iptr = make_unique<int>(); 

を必要としています。実装は簡単です:

template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 
+0

完全性のために機能は素晴らしかったが、私はそれが必要でないほど多く見過ごされたとは思わない。 make_sharedは、2つのオブジェクトを一度に割り当てる問題を解決していることを覚えておいてください(同等のコンストラクタはありません)。一方、unique_ptrはこれを必要としません。 –

+0

これは当てはまりません。 1つの関数呼び出しで2つのunique_ptrを作成すると、まだ安全ではない例外があります。たとえば、make_uniqueが保存します。 – Puppy

+0

その時点でunique_ptrを直接作成することで回避できますか? 'func(unique_ptr (new T)、unique_ptr (new U))' –

4

あなたはそうではありません。 iは動的に割り当てられていないため、削除する必要はありません。そのアドレスの周りにスマートなポインタをラップした場合、ある時点でdelete &iとなり、未定義の動作が起こります。

std::unique_ptr<int> ptr(new int(5)); 

スマートポインタの全体のポイントは、それはあなたのために動的に割り当てられたオブジェクトの寿命を管理していることである:あなただけがそうのように、スマートポインタでnew編を持っている何かをラップする必要があります。 iには自動保存期間があり、スコープの終わりに破棄されます。あなたはそれを助けるために何か必要はありません。

0

unique_ptrが破棄されると、何が起こるのですか?あるいは、変数がスコープから外れるときは、他の方法ですか?

int i; 
auto deleter = [](int *ptr){}; 
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter); 

あなたは何もしないカスタム削除手段を提供する必要があります。それは実際に

1

私はこれが動作すると信じては意味がありません。デフォルトのdeleterは、newによって割り当てられていない自動変数を削除することはできません。 (ただし、これはスマートポインタを使用する目的に反するが、可能であることを示している)。

関連する問題