タグ付けされた質問 「smart-pointers」

自動ガベージコレクションや境界チェックなどの追加機能を提供しながらポインターをシミュレートする抽象データ型



4
いつどのようなポインターを使用しますか?
さて、私が生計を立てるためにC ++を最後に書いたのstd::auto_ptrは、すべてのstd libが利用でき、大流行していましたboost::shared_ptr。提供されている他のスマートポインターの種類のブーストを実際に調べたことはありません。C ++ 11が、ブーストで生まれた型のいくつかを提供することを理解していますが、すべてではありません。 では、誰かがどのスマートポインターをいつ使用するかを決定する簡単なアルゴリズムを持っているのでしょうか。できれば、ダムポインター(のような生のポインターT*)とブーストスマートポインターの残りの部分に関するアドバイスを含めます。(このような何かが素晴らしいでしょう)。


2
unique_ptrをベクターにpush_backできないのはなぜですか?
このプログラムの何が問題になっていますか? #include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } エラー: In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: In member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::unique_ptr<int>, _Tp* …


4
std :: auto_ptrからstd :: unique_ptr
新しい標準(および一部のコンパイラですでに利用可能なパーツ)が登場したことで、新しいタイプstd::unique_ptrはの代わりになるはずですstd::auto_ptr。 それらの使用法は正確にオーバーラップしていますか(コードでグローバル検索/置換を実行できます(そうするわけではありませんが、そうした場合))、またはドキュメントを読んでも明らかでないいくつかの違いに注意する必要がありますか? また、直接置換する場合は、単にstd::auto_ptr?を改善するのではなく、新しい名前を付けるのはなぜですか。

2
クラスメンバーのスマートポインターの使用
C ++ 11のクラスメンバーとしてのスマートポインターの使用法を理解できません。私はスマートポインターについて多くを読みましたが、私はどのようにunique_ptr、およびshared_ptr/またはweak_ptr一般的に機能するかを理解していると思います。わからないのは本当の使い方です。誰もunique_ptrがほとんどいつも行く方法として使うことを勧めているようです。しかし、私はこのようなものをどのように実装しますか: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // do something with myDevice... } ポインタをスマートポインタに置き換えたいとしましょう。のunique_ptrためにA …

8
C ++ライブラリとフレームワークがスマートポインターを使用しないのはなぜですか?
私はいくつかの記事を読んで、生のポインタはほとんど使用してはならないことを述べました。代わりに、スコープ付きポインターでも共有ポインターでも、常にスマートポインター内にラップする必要があります。 しかし、Qtのようなフレームワーク、wxWidgets、Boostのようなライブラリーは、スマートポインターをまったく使用していないかのように、返ったり期待したりしないことに気づきました。代わりに、生のポインタを返すか期待します。その理由はありますか?パブリックAPIを作成するとき、スマートポインターに近づかないでください。なぜですか。 多くの主要なプロジェクトがスマートポインターを回避しているように思われるのに、なぜスマートポインターが推奨されるのか疑問に思っています。

6
なぜstd :: move an std :: shared_ptrなのでしょうか?
私はClangソースコードを調べていましたが、次のスニペットを見つけました。 void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } なぜ私がしたいでしょうか?std::movestd::shared_ptr 共有リソースの所有権を譲渡するポイントはありますか? なぜ私は代わりにこれをしないのですか? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }


3
どのC ++スマートポインター実装を利用できますか?
比較、長所、短所、およびいつ使用するか? これはからのスピンオフです ガベージコレクションスレッド派生したもので、私が単純な答えだと思ったものは、特定のスマートポインターの実装に関する多くのコメントを生成したため、新しい投稿を開始する価値があるように思われました。 結局のところ、問題は、C ++でのスマートポインタのさまざまな実装とは何か、そしてそれらをどのように比較するかです。単純な長所と短所、または例外と、他の方法では機能するはずだと思うかもしれないことの落とし穴 私はいくつかの実装を投稿したか、少なくとも以下の回答として使用することを検討し、100%正確ではない可能性があるそれらの違いと類似点について理解しているので、必要に応じて事実を確認または修正してください。 目標は、いくつかの新しいオブジェクトとライブラリについて学ぶか、すでに広く使用されている既存の実装の私の使用法と理解を修正して、他の人に適切なリファレンスを提供することです。

11
スマートポインター:オブジェクトの所有者は誰ですか?[閉まっている]
ここで何が尋ねられているのかを知るのは難しい。この質問は、あいまいで、あいまいで、不完全で、過度に広い、または修辞的であり、現在の形では合理的に回答することができません。再開できるようにこの質問を明確にするヘルプについては、ヘルプセンターに アクセスしてください。 8年前に閉鎖。 C ++はすべてメモリの所有権、つまり所有権のセマンティクスです。 動的に割り当てられたメモリのチャンクの所有者は、そのメモリを解放する必要があります。したがって、問題は実際には誰がメモリを所有するかになります。 C ++での所有権は、生のポインターが内部にラップされるタイプによって文書化されているため、優れた(IMO)C ++プログラムでは、生のポインターが渡されるのを確認することは非常にまれです(まれではありません)(生のポインターには推論された所有権がないため、誰がメモリの所有者であるかを知らないため、ドキュメントを注意深く読まなければ、誰が所有者であるかはわかりません) 逆に、クラスに生のポインタが格納されていることはまれです。各生のポインタは、独自のスマートポインタラッパー内に格納されます。(注:オブジェクトを所有していない場合は、オブジェクトがスコープ外になり、破棄されるタイミングがわからないため、オブジェクトを格納しないでください。) だから質問: 人々が遭遇した所有権のセマンティクスのタイプは何ですか? これらのセマンティクスを実装するために使用される標準クラスは何ですか? どのような場合に役立ちますか? 回答ごとに1種類のセマンティック所有権を保持し、個別に投票できるようにします。 概要: 概念的には、スマートポインターは単純で、単純な実装は簡単です。私は多くの試みられた実装を見てきましたが、それらは常に何らかの方法で壊れており、何気ない使用や例には明らかではありません。したがって、自分でロールするのではなく、ライブラリから十分にテストされたスマートポインタを常に使用することをお勧めします。std::auto_ptrまたは、Boostスマートポインターの1つが私のニーズをすべてカバーしているようです。 std::auto_ptr<T>: 一人がオブジェクトを所有しています。所有権の譲渡が許可されています。 使用法:これにより、所有権の明示的な移転を示すインターフェースを定義できます。 boost::scoped_ptr<T> 一人がオブジェクトを所有しています。所有権の譲渡は許可されていません。 使用法:明示的な所有権を示すために使用されます。オブジェクトは、デストラクタによって、または明示的にリセットされたときに破棄されます。 boost::shared_ptr<T>(std::tr1::shared_ptr<T>) 複数の所有権。これは単純な参照カウントポインターです。参照カウントがゼロに達すると、オブジェクトは破棄されます。 使用法:オブジェクトが、コンパイル時に決定できない存続期間を持つ複数の所有者を持つことができる場合。 boost::weak_ptr<T>: shared_ptr<T>ポインタのサイクルが発生する可能性がある状況で使用されます。 使用法:サイクルのみが共有参照カウントを維持しているときに、サイクルがオブジェクトを保持しないようにするために使用されます。

4
shared_ptrはどこにありますか?
shared_ptrがどこにあるのかを数時間探した後、私は今とてもイライラしています。私が目にする例はどれも、ヘッダーを含むshared_ptr(そして機能する)完全なコードを示していません。単に述べるだけstdでtr1、<memory>まったく役に立たない!ブーストをダウンロードしましたが、それでも表示されません!誰かがそれを見つける場所を正確に教えてくれますか? 欲求不満を解消させてくれてありがとう! 編集:タイトルが変更されたようです。申し訳ありません。つまり... shared_ptrが「C ++バージョンに依存する」ことは私には明確ではなかったためでもありました->私が環境について述べなかった理由->したがって、おそらく私がそれを見つけることが非常に困難であった理由。 MSVS2008に取り組んでいます。 編集2:理由はわかりませんが、[memory]と[boost / tr1 / memory.hpp]と[boost / tr1 / tr1 / memory]を含めて、どこからでもshared_ptrを探していました。もちろん、できませんでしたない すべての応答をありがとう。

5
C ++の通常のポインターと比較して、スマートポインターのオーバーヘッドはどのくらいですか?
C ++ 11の通常のポインターと比較して、スマートポインターのオーバーヘッドはどのくらいですか?言い換えると、スマートポインターを使用するとコードが遅くなりますか? 具体的には、C ++ 11 std::shared_ptrとについて質問していstd::unique_ptrます。 明らかに、スタックを押し下げたものは大きくなります(少なくとも私はそう思います)。スマートポインターもその内部状態(参照カウントなど)を格納する必要があるため、問題は、実際にはどのくらいになるかです。パフォーマンスに影響がある場合はどうなりますか? たとえば、通常のポインタではなく、関数からスマートポインタを返します。 std::shared_ptr<const Value> getValue(); // versus const Value *getValue(); または、たとえば、関数の1つが通常のポインターの代わりにパラメーターとしてスマートポインターを受け入れる場合: void setValue(std::shared_ptr<const Value> val); // versus void setValue(const Value *val);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.