std::unique_ptrについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
c++習いはじめ

std::unique_ptrについて

#1

投稿記事 by c++習いはじめ » 14年前

コード:

  
#include <memory>
int main(){
	std::unique_ptr< int > a;
}


スマートポインタを勉強中ですが、unique_ptrを使いたいのですが、
1>.\main.cpp(39) : error C2039: 'unique_ptr' : 'std' のメンバではありません。
1>.\main.cpp(39) : error C2065: 'unique_ptr' : 定義されていない識別子です。
と出ますが何をインクルードすれば使えるようになるのでしょうか?
お願いします

yuki
記事: 5
登録日時: 15年前

Re: std::unique_ptrについて

#2

投稿記事 by yuki » 14年前

memoryの中に入ってます。
しかし、環境が書かれていないのでなんとも言えませんが、環境によっては入ってないようです。
因みに、私の環境(VC++2008)には入っていませんでした。
VC++2010では使えるようです。

しひ

Re: std::unique_ptrについて

#3

投稿記事 by しひ » 14年前

std::unique_ptrはC++0x(C++の次のバージョン)の標準ライブラリに含まれるものなので、
C++0xにある程度対応しているコンパイラでないと使えません。
具体的にはVC++2010以降、gcc4.4.0以降など。

代替としてはVC++2008のstd::auto_ptr(似て非なるものらしいのですが)、
boostライブラリのboost::scoped_ptrなど。

c++習いはじめ

Re: std::unique_ptrについて

#4

投稿記事 by c++習いはじめ » 14年前

失礼しました。
動作環境はVC 2008 でwindows7 です。
ではstd::unique_ptrはstd::auto_ptrと同じ役割を果たすのでしょうか?
違うのであれば、どうすれば、VC2008では使用するにはどうすればよろしいのでしょうか?
度々申し訳ありません。お願いします。

しひ

Re: std::unique_ptrについて

#5

投稿記事 by しひ » 14年前

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に相当します。

tk-xleader

Re: std::unique_ptrについて

#6

投稿記事 by tk-xleader » 14年前

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

c++習いはじめ

Re: std::unique_ptrについて

#7

投稿記事 by c++習いはじめ » 14年前

回答いただきた方々ありがとうございます。
スマートポインタのことをいろいろあることを知ることができて、とてもよかったです。
これから、もっと勉強していきたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る