問題タブ [auto-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ポインターとスマートポインターの違い
このコードの何が問題になっているのか教えていただけますか?面接で聞いたのですが、何が悪いのかわかりません
tClassは、tClassのメンバーを出力するメソッドprintSomethingを持つテストクラスです。
またはこれはトリックの質問です。
c++ - auto_ptr with swig
auto_ptr を使用する C++ ライブラリをラップしようとしています。私は swig を使用しており、Python バインディングを生成したいと考えています。ここで、swig をスマート ポインターで使用する方法に関する swig ドキュメントのセクションを見てきました。しかし、私はそれを機能させることができません。
Swig は const 参照を使用して auto_ptr を初期化するコードを生成しますが、auto_ptr は auto_ptr(auto_ptr &) などの非 const 参照を使用してコピー コンストラクターを定義します。生成されたコードは、"discards const qualifiers" でコンパイルされません。const 修飾子を手動で削除すると、コードは正常にコンパイルされます。
多くのメーリング リスト エントリを見てきましたが、何も役に立ちませんでした。誰かが私に実用的な例を提供できますか? 私の非動作サンプルはここにあります:
次の CMakeLists.txt で cmake を使用してコンパイルしました。
c++ - C++ std::auto_ptr コピー コンストラクター
std::auto_ptr には const コピー コンストラクターがないため、コレクションで直接使用することはできません。たとえば、ブースト ポインター コレクション テンプレートを使用せずに std::auto_ptr のベクトルを設定する方法はありますか?
c++ - std::auto_ptr データ メンバーを使用すると UB が呼び出されますか?
vector に格納された auto_ptr を含む Classへのフォローアップとして、コピーの構築とコピーの代入の両方auto_ptr
がユーザー定義である限り、コンテナー要素としてメンバーを持つクラスを使用しても問題ないという明言されていない結論があると思います(そうしないように) s コピー コンストラクターとコピー代入を呼び出します)。これについて、標準ライブラリの要件に違反するものはありますか?auto_ptr
慣用的にやり始めたいので、次の点に問題がある場合は教えてください。
私が気づいたことの 1 つは、このアプローチでは、Y
のクラス定義が の定義のスコープ内にある必要があることですX
(「生の」ポインタY
が使用されている場合に前方宣言されるのとは対照的に)。これは、auto_ptr
がインスタンス化されるときに、そのデストラクタが で delete を呼び出す必要があり、不完全な型であってはならないY
ためです。クラスが複数のリソースを管理する(複数のメンバーを持つ)Y
場合、これは RAII の値と比較検討する必要があると思います。これについて何か考えはありますか?X
auto_ptr
この手法は全体的に優れていると思います。潜在的に複数のリソース (単一責任プリンシパル) を構築/破棄/コピーする必要があるクラスの多くのトリッキーなコードを排除するためです。auto_ptr
目的を果たしているかどうか、または言語/標準ライブラリの微妙な要件のためにここで機能しないかどうか疑問に思っています。
私は他のタイプのスマート ポインターを認識していますが、ライブラリ インターフェイスを実装しているので、クライアントに Boost や TR1 の要件を課したくないことに注意してください。一般的なの使用に関する講義はすべてauto_ptr
反対票を投じられます!
c++ - コンテナオブジェクトのサブセットへの参照
コレクションのサブセットへの参照があることについて簡単な質問があります。オブジェクトのベクトルがあると考えてください。ここで、このベクトルのサブセットである別のベクトルを作成したいのですが、オブジェクトのサブセットのコピーを作成したくありません。
私が考えていた方法の1つは、を作成することvector<auto_ptr<MyClass> >
です。これは良いアプローチですか?この場合、他のコンテナ、イディオム、またはパターンが役立つと思われるかどうかを提案してください。ありがとうございました
c++ - std::auto_ptr のコピー コンストラクターをどのように実装できますか?
私のクレイジーなAutoArrayの話に戻ります...(そこから重要なビットを引用します:
)
とにかく、コピーコンストラクターを実装しようとしています。次のようなクライアント コードがあります (ビルドされないため、まだ bitbucket にコミットされていません)。
コピー コンストラクターが非参照を引数として取るため、これは失敗します .... しかし、代入で使用されるソースが変更されていることを考えると、参照const
を取るようにコピー コンストラクターを変更する方法がわかりません(したがって、ではない)。もちろん、値渡しを使用するように変更することはできません。これはコピー コンストラクターであり、無限ループになるからです。const
AutoArray
const
を使用していた場合auto_ptr
、これは有効です。
では、どのようにしてauto_ptr
のコピー セマンティクスを持つクラスが可能になるのでしょうか?
c++ - C++03 で `std::auto_ptr` のコレクションのようなものを返す最良の方法は何ですか?
std::auto_ptr
などの STL コンテナーに格納することはできませんstd::vector
。ただし、ポリモーフィック オブジェクトのコレクションを返す必要がある場合があり、オブジェクトのベクトルを返すことができません (スライシングの問題が原因です)。それらを使用std::tr1::shared_ptr
して に貼り付けることができますvector
が、個別の参照カウントを維持するという高い代償を払わなければならず、実際のメモリ (コンテナー) を所有するオブジェクトは、オブジェクトを論理的に "所有" しなくなります。所有権に関係なく。
C++0x は、この問題に対する完璧なソリューションを の形で提供しますstd::vector<std::unique_ptr<t>>
が、私は C++0x にアクセスできません。
その他の注意事項:
- C++0x にはアクセスできませんが、TR1 は利用できます。
- Boostの利用は避けたい(他に選択肢がなければ利用可能だが)
boost::ptr_container
コンテナー (つまり)を認識してboost::ptr_vector
いますが、デバッガーが壊れるため、これを避けたいと思います (void *
内部は s に格納されているため、コンテナー内に実際に格納されているオブジェクトをデバッガーで表示することは困難です)。
c++ - auto_ptrを使用する理由はありますか?
JossutisのSTL本からのauto_ptrに関する説明を読んだ後、auto_ptrの多くの落とし穴の1つが原因で、それを使用しようとすると100%失敗するという強い印象を受けました。
私の質問は、auto_ptrが本当に便利で、そこにうまく適合する実際のタスクはありますか?
c++ - C++-ここでFred*からauto_ptrへの暗黙のキャストはありますか?
私は次のコードを見ました、
関数作成にリストされている質問を参照してください。
ありがとうございました
//コメントに基づいて更新
はい、コードはVC8.0エラーC2664を渡すことができません:'std :: auto_ptr <_Ty> :: auto_ptr(std :: auto_ptr <_Ty>&)throw()':パラメーター1を'Fred*'から'に変換できませんstd :: auto_ptr <_Ty>& '
コードはC++FAQ12.15からコピーされました。
ただし、以下の変更を行った後、
このコードはVC8.0コンパイラを渡すことができます。しかし、これが正しい修正であるかどうかはわかりません。
c++ - std::vector のようなコンテナー内のスマート ポインター?
私はスマート ポインター ( ) について学習していますが、スマート ポインター ( ) をコンテナー (つまり ) に入れるべきではないことをこことここstd::auto_ptr
で読んだだけです。スマート ポインターが内部的に (たとえば、クラスごとに) コピーされず、その所有権を譲渡しないという規則はありません。その後、ポインターは NULL になります。結局、すべてが台無しになります。std::auto_ptr
std::vector
vector
実際、これはどのくらいの頻度で発生しますか?
時々私はポインターのベクトルを持っていますが、将来、スマートポインターのベクトルを持ちたいと決めた場合、私のオプションは何ですか?
私は C++0x と Boost ライブラリを認識していますが、今のところ、STL アプローチに固執したいと思います。