問題タブ [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.

0 投票する
1 に答える
903 参照

c++ - 共有ポインタの削除

QScriptEngineclass のオーバーロードされたクラス コンストラクターを介して渡しているへのポインターがあり、EvaluatorそれをQScriptEngine *engine_(クラスPropertyサブクラスEvaluator、および のこのコンストラクターを呼び出しEvaluatorて、既に割り当てられている に渡しますQScriptEngine) に割り当てます。引数のないコンストラクターは、新しいQScriptEngineポインターを作成します (この方法でクラスのGenericサブクラスEvaluatorを作成します)。デストラクタで、そうengine_でないかどうかをテストNULLし、ポインタを削除してから割り当てますNULLengine_派生のポインター ( )Propertyも にする必要がありますNULLか? そうではないことを何かが教えてくれます。そうでない場合、この状況にどのように対処しますか? QScriptEngine全体を通して同じインスタンスである必要があります。QScriptEngineの = 演算子はプライベートです。または、ポインターをすべて一緒に回避します。

別のSOの質問で、共有ポインタ(boost::shared_ptrおよび)に関する情報を見ました。std:tr1::shared_ptr私はすでに正規表現ライブラリにブーストを使用しているので、これがこれに対処する最善の方法である場合、ブーストは問題外ではありません。一般的な C++ の知識と将来のプロジェクトのために、ブースト以外の方法があることを願っています。

0 投票する
4 に答える
16142 参照

c++ - テンプレートを使用した shared_ptr

構造体へのスマート ポインターを作成する場合は、次のようにします。

だから、私は次のように書くことができます:

しかし、そのようなテンプレート構造体がある場合:

そして、次のように書きたいと思います。

では、どのように B_Ptr を宣言すればよいでしょうか?

0 投票する
7 に答える
2685 参照

c++ - ポリモーフィズムとポインタのベクトルに関するC ++の問題

次のコード例を検討してください。

私は現在のプロジェクトでこのような問題を抱えています。クライアント コードは、 inで宣言されているin へのBarCollectionポインタを格納する を使用します。ここで、バーへのポインターのコレクションをクライアント コードに公開したいと思います。クライアント コードに s へのポインタのベクトルへのアクセスを許可し、これらをクライアント コード内の s へのポインタにキャストすることもできますが、クライアントは の存在を知る必要がないため、これは間違っていると感じます。Barsd_foosFooCollectionFooBarFoo

get()オブジェクトを取得してキャストするメンバーを定義することもできますd_foosが、これはかなりぎこちなく感じます。できれば、 d_foos を として返したいのvector<shared_ptr<Bar> > &ですが、これができないようです。

また、私の設計が単に間違っている可能性もあります。Barただし、の専門化でFooありBarCollection、の専門化でFooCollectionあり、機能を共有しているため、最も自然な解決策のように見えました。

実装するための優れたソリューション、またはより優れた設計の代替案を提案できますgetBarsBarCollection?

編集:

私のデザインは確かに悪かったことがわかりました。FooCollection のすべての機能を必要とするにもかかわらず、BarCollection は FooCollection ではありません。以下の回答に基づく私の現在の解決策 - これは非常にクリーンです - は次のとおりです。

すべての優れた提案と例をありがとう!

0 投票する
5 に答える
43333 参照

c++ - shared_ptrとscoped_ptr

scoped_ptrはコピーできず、スコープ外で削除されています。だからそれは一種の制限されていshared_ptrます。したがって、本当にコピー操作を制限する必要がある場合以外に、shared_ptr使用する方がよいようです。オブジェクトのコピーを作成する必要があるかどうかわからない場合があるためです。したがって、問題は次のとおりです。上記の場合に加えて、のshared_ptr代わりに使用する方が良い(または推奨される)と考えられますかscoped_ptrscoped_ptrからはるかに高速に動作しますかshared_ptr、それとも何か利点がありますか?

ありがとう!

0 投票する
1 に答える
1721 参照

c++ - std :: list of boost::shared_ptrのイテレータに関する問題

次のコードに問題があります。

gcc(4.2.1)は私に教えてくれます:

MessagePointerのリストのイテレータを作成できないのはなぜだろうか。

何か案は?

ありがとうございました。

0 投票する
1 に答える
20968 参照

c++ - shared_ptrでメモリリークを回避するには?

次のコードを検討してください。

出力はありません。デストラクタは呼び出されません。メモリーリーク。私は常に、スマート ポインターがメモリ リークの回避に役立つと信じてきました。

クラス内で相互参照が必要な場合はどうすればよいですか?

0 投票する
5 に答える
32058 参照

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?

0 投票する
4 に答える
19244 参照

boost - const shared_ptr から shared_ptr

const オブジェクトを指す shared_ptr を非 const オブジェクトを指す shared_ptr に変換するにはどうすればよいですか。私は次のことをしようとしています:

しかし、うまくいきません。

0 投票する
2 に答える
964 参照

c++ - shared_ptr、サブスクリプション、デストラクタ

アプリケーション全体で Boost/shared_ptr ポインターを使用しています。オブジェクトへの最後の参照が解放されると、shared_ptr がオブジェクトを削除します。アプリケーション内のオブジェクトは、オブザーバー/サブスクライバー パターンと同様に、アプリケーションの中央の場所でイベントをサブスクライブします。

オブジェクト デストラクタでは、オブジェクトはサブスクリプションのリストから自身をサブスクライブ解除します。サブスクリプションのリストは基本的に単なるlist<weak_ptr<MyObject> >. 私がやりたいことは、これに似たものです:

ここでの問題は、デストラクタで shared_from_this を呼び出すことができないため、上記のコードで例外がスローされることです。

私の古い実装では、サブスクリプション リストは単なるポインターのリストでしたが、それは機能していました。しかし、代わりにweak_ptr参照を使用して、手動のメモリ管理によってメモリを台無しにするリスクを減らしたいと考えています。

オブジェクトの削除は shared_ptr に依存しているため、Unsubscribe を論理的に呼び出すことができる場所がコード内に 1 か所もありません。

この状況で何をすべきかについてのアイデアはありますか?

0 投票する
7 に答える
4520 参照

c++ - C++: auto_ptr + 前方宣言?

私はこのようなクラスを持っています:

.cpp では、コンストラクターがInnerwithのインスタンスを作成しnew、デストラクターがそれをdeletes します。これはかなりうまくいっています。
このコードを使用するように変更したいので、次のauto_ptrように記述します。

これで、コンストラクターが を初期化しauto_ptr、デストラクタは何もしません。

しかし、うまくいきません。このクラスをインスタンス化するときに問題が発生するようです。次の警告が表示されます。

警告 C4150: 不完全な型 'Inner' へのポインターの削除。デストラクタが呼び出されていません

ええと、これは明らかに非常に悪いことであり、私はそれが起こる理由を理解していInnerます.auto_ptr<Inner>

だから私の質問:auto_ptr単純なポインターだけを使用するバージョンで行ったように、前方宣言で使用する方法はありますか?
ポインターを宣言する#includeすべてのクラスに対して行うことは、非常に面倒で、時には不可能なこともあります。この問題は通常どのように処理されますか?