問題タブ [shared-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++ - 共有ポインタの削除
QScriptEngine
class のオーバーロードされたクラス コンストラクターを介して渡しているへのポインターがあり、Evaluator
それをQScriptEngine *engine_
(クラスProperty
サブクラスEvaluator
、および のこのコンストラクターを呼び出しEvaluator
て、既に割り当てられている に渡しますQScriptEngine
) に割り当てます。引数のないコンストラクターは、新しいQScriptEngine
ポインターを作成します (この方法でクラスのGeneric
サブクラスEvaluator
を作成します)。デストラクタで、そうengine_
でないかどうかをテストNULL
し、ポインタを削除してから割り当てますNULL
。engine_
派生のポインター ( )Property
も にする必要がありますNULL
か? そうではないことを何かが教えてくれます。そうでない場合、この状況にどのように対処しますか? QScriptEngine
全体を通して同じインスタンスである必要があります。QScriptEngine
の = 演算子はプライベートです。または、ポインターをすべて一緒に回避します。
別のSOの質問で、共有ポインタ(boost::shared_ptr
および)に関する情報を見ました。std:tr1::shared_ptr
私はすでに正規表現ライブラリにブーストを使用しているので、これがこれに対処する最善の方法である場合、ブーストは問題外ではありません。一般的な C++ の知識と将来のプロジェクトのために、ブースト以外の方法があることを願っています。
c++ - テンプレートを使用した shared_ptr
構造体へのスマート ポインターを作成する場合は、次のようにします。
だから、私は次のように書くことができます:
しかし、そのようなテンプレート構造体がある場合:
そして、次のように書きたいと思います。
では、どのように B_Ptr を宣言すればよいでしょうか?
c++ - ポリモーフィズムとポインタのベクトルに関するC ++の問題
次のコード例を検討してください。
私は現在のプロジェクトでこのような問題を抱えています。クライアント コードは、 inで宣言されているin へのBarCollection
ポインタを格納する を使用します。ここで、バーへのポインターのコレクションをクライアント コードに公開したいと思います。クライアント コードに s へのポインタのベクトルへのアクセスを許可し、これらをクライアント コード内の s へのポインタにキャストすることもできますが、クライアントは の存在を知る必要がないため、これは間違っていると感じます。Bars
d_foos
FooCollection
Foo
Bar
Foo
get()
オブジェクトを取得してキャストするメンバーを定義することもできますd_foos
が、これはかなりぎこちなく感じます。できれば、 d_foos を として返したいのvector<shared_ptr<Bar> > &
ですが、これができないようです。
また、私の設計が単に間違っている可能性もあります。Bar
ただし、の専門化でFoo
ありBarCollection
、の専門化でFooCollection
あり、機能を共有しているため、最も自然な解決策のように見えました。
実装するための優れたソリューション、またはより優れた設計の代替案を提案できますgetBars
かBarCollection
?
編集:
私のデザインは確かに悪かったことがわかりました。FooCollection のすべての機能を必要とするにもかかわらず、BarCollection は FooCollection ではありません。以下の回答に基づく私の現在の解決策 - これは非常にクリーンです - は次のとおりです。
すべての優れた提案と例をありがとう!
c++ - shared_ptrとscoped_ptr
scoped_ptr
はコピーできず、スコープ外で削除されています。だからそれは一種の制限されていshared_ptr
ます。したがって、本当にコピー操作を制限する必要がある場合以外に、shared_ptr
使用する方がよいようです。オブジェクトのコピーを作成する必要があるかどうかわからない場合があるためです。したがって、問題は次のとおりです。上記の場合に加えて、のshared_ptr
代わりに使用する方が良い(または推奨される)と考えられますかscoped_ptr
。scoped_ptr
からはるかに高速に動作しますかshared_ptr
、それとも何か利点がありますか?
ありがとう!
c++ - std :: list of boost::shared_ptrのイテレータに関する問題
次のコードに問題があります。
gcc(4.2.1)は私に教えてくれます:
MessagePointerのリストのイテレータを作成できないのはなぜだろうか。
何か案は?
ありがとうございました。
c++ - shared_ptrでメモリリークを回避するには?
次のコードを検討してください。
出力はありません。デストラクタは呼び出されません。メモリーリーク。私は常に、スマート ポインターがメモリ リークの回避に役立つと信じてきました。
クラス内で相互参照が必要な場合はどうすればよいですか?
c++ - Detach a pointer from a shared_ptr?
Possible Duplicate:
How to release pointer from boost::shared_ptr?
A function of my interface returns a pointer to an object. The user is supposed to take ownership of that object. I do not want to return a Boost.shared_ptr, because I do not want to force clients to use boost. Internally however, I would like to store the pointer in a shared_ptr to prevent memory leaks in case of exceptions etc. There seems to be no way to detach a pointer from a shared pointer. Any ideas here?
boost - const shared_ptr から shared_ptr
const オブジェクトを指す shared_ptr を非 const オブジェクトを指す shared_ptr に変換するにはどうすればよいですか。私は次のことをしようとしています:
しかし、うまくいきません。
c++ - shared_ptr、サブスクリプション、デストラクタ
アプリケーション全体で Boost/shared_ptr ポインターを使用しています。オブジェクトへの最後の参照が解放されると、shared_ptr がオブジェクトを削除します。アプリケーション内のオブジェクトは、オブザーバー/サブスクライバー パターンと同様に、アプリケーションの中央の場所でイベントをサブスクライブします。
オブジェクト デストラクタでは、オブジェクトはサブスクリプションのリストから自身をサブスクライブ解除します。サブスクリプションのリストは基本的に単なるlist<weak_ptr<MyObject> >
. 私がやりたいことは、これに似たものです:
ここでの問題は、デストラクタで shared_from_this を呼び出すことができないため、上記のコードで例外がスローされることです。
私の古い実装では、サブスクリプション リストは単なるポインターのリストでしたが、それは機能していました。しかし、代わりにweak_ptr参照を使用して、手動のメモリ管理によってメモリを台無しにするリスクを減らしたいと考えています。
オブジェクトの削除は shared_ptr に依存しているため、Unsubscribe を論理的に呼び出すことができる場所がコード内に 1 か所もありません。
この状況で何をすべきかについてのアイデアはありますか?
c++ - C++: auto_ptr + 前方宣言?
私はこのようなクラスを持っています:
.cpp では、コンストラクターがInner
withのインスタンスを作成しnew
、デストラクターがそれをdelete
s します。これはかなりうまくいっています。
このコードを使用するように変更したいので、次のauto_ptr
ように記述します。
これで、コンストラクターが を初期化しauto_ptr
、デストラクタは何もしません。
しかし、うまくいきません。このクラスをインスタンス化するときに問題が発生するようです。次の警告が表示されます。
警告 C4150: 不完全な型 'Inner' へのポインターの削除。デストラクタが呼び出されていません
ええと、これは明らかに非常に悪いことであり、私はそれが起こる理由を理解していInner
ます.auto_ptr<Inner>
だから私の質問:auto_ptr
単純なポインターだけを使用するバージョンで行ったように、前方宣言で使用する方法はありますか?
ポインターを宣言する#include
すべてのクラスに対して行うことは、非常に面倒で、時には不可能なこともあります。この問題は通常どのように処理されますか?