std::unique_ptrについて
Re: std::unique_ptrについて
memoryの中に入ってます。
しかし、環境が書かれていないのでなんとも言えませんが、環境によっては入ってないようです。
因みに、私の環境(VC++2008)には入っていませんでした。
VC++2010では使えるようです。
しかし、環境が書かれていないのでなんとも言えませんが、環境によっては入ってないようです。
因みに、私の環境(VC++2008)には入っていませんでした。
VC++2010では使えるようです。
Re: std::unique_ptrについて
std::unique_ptrはC++0x(C++の次のバージョン)の標準ライブラリに含まれるものなので、
C++0xにある程度対応しているコンパイラでないと使えません。
具体的にはVC++2010以降、gcc4.4.0以降など。
代替としてはVC++2008のstd::auto_ptr(似て非なるものらしいのですが)、
boostライブラリのboost::scoped_ptrなど。
C++0xにある程度対応しているコンパイラでないと使えません。
具体的にはVC++2010以降、gcc4.4.0以降など。
代替としてはVC++2008のstd::auto_ptr(似て非なるものらしいのですが)、
boostライブラリのboost::scoped_ptrなど。
Re: std::unique_ptrについて
失礼しました。
動作環境はVC 2008 でwindows7 です。
ではstd::unique_ptrはstd::auto_ptrと同じ役割を果たすのでしょうか?
違うのであれば、どうすれば、VC2008では使用するにはどうすればよろしいのでしょうか?
度々申し訳ありません。お願いします。
動作環境はVC 2008 でwindows7 です。
ではstd::unique_ptrはstd::auto_ptrと同じ役割を果たすのでしょうか?
違うのであれば、どうすれば、VC2008では使用するにはどうすればよろしいのでしょうか?
度々申し訳ありません。お願いします。
Re: std::unique_ptrについて
std::auto_ptrもstd::unique_ptrもスマートポインタに変わりないので、
どちらも確保したメモリを自動的に解放する役割を持ちます。
ただし、std::auto_ptrはstd::unique_ptrに比べ「配列のポインタを入れられない」
「コンテナの要素にできない」などの制限があります。
ある程度狭いスコープ内で配列以外のポインタの解放忘れを防ぎたい、程度であれば
std::auto_ptrで問題無いと思います。
VC++2008でstd::unique_ptrと同等のことをしたい場合は、
boostというライブラリを利用することになります。詳しくは検索して下さい。
boost::scoped_ptr(配列の場合はboost::scoped_array)がstd::unique_ptrに相当します。
どちらも確保したメモリを自動的に解放する役割を持ちます。
ただし、std::auto_ptrはstd::unique_ptrに比べ「配列のポインタを入れられない」
「コンテナの要素にできない」などの制限があります。
ある程度狭いスコープ内で配列以外のポインタの解放忘れを防ぎたい、程度であれば
std::auto_ptrで問題無いと思います。
VC++2008でstd::unique_ptrと同等のことをしたい場合は、
boostというライブラリを利用することになります。詳しくは検索して下さい。
boost::scoped_ptr(配列の場合はboost::scoped_array)がstd::unique_ptrに相当します。
Re: std::unique_ptrについて
std::auto_ptr,std::unique_ptr はともに"所有権"に基づいたスマートポインタです。ですから、これらではスマートポインタオブジェクトとオブジェクトが一対一で対応します(NULL Stateは除く)
違いは、auto_ptr はコピーコンストラクタ(autoptr(auto_ptr&)),代入演算子operator=(auto_ptr&)で所有権を移動します。ですから、見た目コピーをしているように見えても、実はムーブ(元のオブジェクトは破壊される)が行われるわけです。
それに対し、unique_ptr はムーブコンストラクタ(unique_ptr(unique_ptr&&)),ムーブ代入演算子 operator=(unique_ptr&&)で所有権を移動します。ですから、一時オブジェクトとして生成されたオブジェクトや、std::move(static_cast<unique_ptr&&>(ptr)と同等)で明示的に右辺値(つまり、もうこのオブジェクトいらないから好きにしてよと明確に表明する)をしないとムーブされません。
newしたオブジェクトに対するスマートポインタとして使うならば、しひさんの挙げた制限を除けば、unique_ptrをauto_ptrで代用することは可能です。ただし、unique_ptr にはカスタムデリータを第二テンプレート引数に取れるという特徴があります。
それと、Boostには unique_ptr のC++03版(右辺値参照とかムーブとかをエミュレートしている)があります。
参考:http://d.hatena.ne.jp/gintenlabo/20101205/1291555934
違いは、auto_ptr はコピーコンストラクタ(autoptr(auto_ptr&)),代入演算子operator=(auto_ptr&)で所有権を移動します。ですから、見た目コピーをしているように見えても、実はムーブ(元のオブジェクトは破壊される)が行われるわけです。
それに対し、unique_ptr はムーブコンストラクタ(unique_ptr(unique_ptr&&)),ムーブ代入演算子 operator=(unique_ptr&&)で所有権を移動します。ですから、一時オブジェクトとして生成されたオブジェクトや、std::move(static_cast<unique_ptr&&>(ptr)と同等)で明示的に右辺値(つまり、もうこのオブジェクトいらないから好きにしてよと明確に表明する)をしないとムーブされません。
newしたオブジェクトに対するスマートポインタとして使うならば、しひさんの挙げた制限を除けば、unique_ptrをauto_ptrで代用することは可能です。ただし、unique_ptr にはカスタムデリータを第二テンプレート引数に取れるという特徴があります。
それと、Boostには unique_ptr のC++03版(右辺値参照とかムーブとかをエミュレートしている)があります。
参考:http://d.hatena.ne.jp/gintenlabo/20101205/1291555934
Re: std::unique_ptrについて
回答いただきた方々ありがとうございます。
スマートポインタのことをいろいろあることを知ることができて、とてもよかったです。
これから、もっと勉強していきたいと思います。
スマートポインタのことをいろいろあることを知ることができて、とてもよかったです。
これから、もっと勉強していきたいと思います。