問題タブ [object-lifetime]
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++ - 参照メンバーへのこのC++の一時的なバインドは違法である必要がありますか?
私の質問(この後、長いイントロについて申し訳ありませんが、質問は太字で示されています)は、元々、Herb Sutters Exceptional C ++のアイテム23に触発されており、次のようなものがあります:
<snip>
と
</ snip>
さて、私はそのコードに関して次の問題を抱えています(そして、いいえ、C ++の専門家としてのSutter氏の腕前に疑いの余地はありません):
- GTAClient&workerは一時的なものをとることができない非定数参照であるため、このような例は機能しませんが、標準以前に記述されているか、タイプミスである可能性があります。それは私のポイントではありません。
- 問題1が無視されたとしても、彼がワーカー参照をどうするのか不思議に思います。
明らかに、その意図は、 (ポリモーフィック)インターフェースによってアクセスされるMyWorker
NVIで使用することです。これにより、実装がタイプの(値)メンバーを所有することが除外されます。これは、スライスなどが発生するためです。値セマンティクスはポリモーフィズムとうまく混ざりません。 そのクラスはに不明であるため、タイプのデータメンバーを持つこともできません。 したがって、元のオブジェクトとポリモーフィックな性質を維持しながら、ポインターまたは参照を介して使用することを意図していたに違いないと結論付けます。GenericTableAlgorithm
GTAClient
GTAClient
MyWorker
GenericTableAlgorithm
- 一時オブジェクト()へのポインタが
MyWorker()
良いアイデアになることはめったにないので、作者の計画は(const)参照にバインドされた一時オブジェクトの延長された寿命を使用し、そのような参照をオブジェクトpimpl_
ポイントに格納してそこから使用することだったと思います。(注:GTAClientには、これを機能させる可能性のあるクローンメンバー関数もありません。バックグラウンドにRTTI-typeinfoベースのファクトリが潜んでいるとは限りません。)
そして、ここで(ついに!)私の質問は次のようになります。(どのように)寿命が延長されたクラスの参照メンバーに一時を渡すことは合法的に行うことができますか?
§12.2.5の標準(C ++ 0xバージョンですが、C ++でも同じです。チャプター番号はわかりません)では、ライフタイム拡張から次の例外が発生します。
"-コンストラクターの参照メンバーに一時的にバインドされます。ctor-initializer(12.6.2)は、コンストラクターが終了するまで存続します。」
したがって、オブジェクトはクライアントコードa.Process()の呼び出しでは使用できません。参照された一時的なfromMyWorker()
はすでに死んでいるからです!
問題を実証する私自身のクラフトの例を考えてみましょう(GCC4.2でテスト済み):
出力を生成します
const oogie&refの場合、func()のすぐに参照にバインドされた一時的な戻り値は、その参照の存続期間が延長されている(mainの終わりまで)ので、問題ないこと
がわかります。
しかし:1000-oogieオブジェクトは、kangoo-sが構築された直後にすでに破壊されています。コードは機能しますが、ここではアンデッドオブジェクトを扱っています...
もう一度質問をします。
まず、ここで何かが足りないので、コードは正しい/合法ですか?。
次に、-Wallが指定されていても、GCCが警告を表示しないのはなぜですか?それが必要ですか?できますか?
お時間をいただきありがとうございます、
マーティン
java - Google Guice による生涯管理
Guice で作成したオブジェクトをシャットダウン/閉じるための推奨パターンはありますか?
私が目指しているライフサイクルは次のとおりです。
- Guice モジュールの準備
- インジェクターを作成する
- コードでインジェクターを使用してオブジェクトを取得します (
injector.getInstance(Foo.class)
) - ...
- 上記のオブジェクト (ファイル ハンドル、TCP 接続など) によって保持されているすべてのリソースを閉じます。これを決定論的なステップにしたいです(「GCが実行される日」ではありません)。
wcf - WCF サービスでの Linq から Sql DataContext へのライフ サイクル
WCF を介して公開されているサービスがあります。このサービスは、Linq to SQL データ コンテキストを介してデータベースと対話するいくつかのメソッドを公開します。datacontext は CallContext にバインドされます。これはすべて正常に機能していますが、Linq to SQL データコンテキストを配置する適切な場所がわかりません。助けてください。
c++ - COMポインタをグローバルシングルトンオブジェクトに格納する際の問題
バックグラウンド
私が使用しているアプリケーションには、いくつかのCOMDLLがあります。
COM DLLの1つには、他のDLLのCOMインターフェイスへのポインタを格納するグローバルシングルトンオブジェクトがあります。これはグローバルシングルトンオブジェクトであるため、ポインタを取得しようとしているインターフェイスがまだロードされていないDLLに存在する可能性があるため、レイジー初期化イディオムを採用しました。
(補足:グローバルオブジェクトはプロセス内で構築されるため、単一のDLLを登録する場合、これは特に重要regsvr32
です。このプロセス中にDLLが別のDLLへのインターフェイスを取得しようとしないようにします。)
たとえば、私の怠惰な初期化メソッドは次のようになります。
注: m_pMyOtherObject
は、このタイプのメンバー変数ですCComPtr
。
怠惰な初期化はここでの私の問題とは関係がないかもしれませんが、完全を期すために含めています。
問題
私が気付いたのは、状況によっては、アプリケーションがシャットダウンしたときにアサーションが失敗することです。ただし、 (メンバー変数として格納するのではなく)アクセスする必要があるQueryInterface()
たびに呼び出すようにコードを変更すると、アサーションが防止されます。IID_IMyOtherOBject
これは、COMオブジェクトの存続期間の問題であるように思われます。私の仮説は、私はstoring
COMポインターであるため、私が指しているCOMインターフェイスの破棄とそれに対する私自身のポインターとの間に何らかの同期が必要であるというものです。
(私が使用している)クラスについての私の理解は、それが生涯の問題(すなわち、電話と)CComPtr
に対処することの多くの頭痛を取り除くということです。しかし、私の場合は機能していないようです。AddRef()
Release()
誰かが私が間違っているかもしれないことを選ぶことができますか?
c# - mvc タービンの寿命管理?
(Unity を使用して) mvc タービンでサービスの有効期間を管理するにはどうすればよいですか?
IConfigurationService と ILoggerService を受け取る ISearchService 実装の LuceneSearchService があります。
現在、私の検索サービスの登録は次のようになっています。
Turbine でインスタンスを作成する責任を負いたいのですが、シングルトンにしたいのです。
言い換えれば、寿命をどのように定義できますか?
c# - Unity によって開始されたこのインスタンスがシングルトンではないのはなぜですか?
私のasp.net-mvcアプリケーションには、静的CreateContainer()メソッドを呼び出すstatis MvcApplicationがあります。
このメソッドでは、unity ioc コンテナーを作成します。
ソースをよく理解していれば、シングルトンの LuceneSearchService インスタンスが得られるはずです。ただし、私のロギングでは、このインスタンスが要求されるたびにコンストラクターがヒットすることがわかります。
私は何を間違っていますか?
python - 予期しないときにPythonで呼び出される__del__メソッド
私は Python を初めて使用し、Swaroop CH の「A Byte of Python」の例に取り組んできました。私を__del__
困惑させている方法でいくつかの動作が見られます。
基本的に、次のスクリプトを実行すると(Python 2.6.2で)
Python コンソール (または Spyder インタラクティブ コンソール) を使用すると、次のように表示されます。
execfile(u'C:\1_eric\Python\test1.py')
Swaroopの
初期化 Kalem の初期化execfile(u'C:\1_eric\Python\test1.py') Swaroop を
初期化 して い ます
2 回目の実行の__del__
直後にメソッドが呼び出されるのはなぜですか?
同じインスタンス名 (「swaroop」と「kaleem」) が使用されているため、元のインスタンスを解放し、それをガベージ コレクションしていると推測しています。しかし、これは現在の人口数に大混乱を引き起こしているようです。 __init__
ここで何が起こっているのですか?
この種の混乱を避ける良い方法は何ですか? ?
の使用は避けてください。__del__
再利用する前に既存のインスタンス名を確認しますか? ...
ありがとう、エリック
boost - ブースト信号-サブスクライバーに送信されるオブジェクトの存続期間をどのように制御しますか?スマートポインタ?
Red Hat EnterpriseLinux5.3でboost::signals2を使用しています。
私のシグナルはオブジェクトコピーを作成し、そのポインターをサブスクライバーに送信します。これは、スレッドの安全性のために実装され、ワーカースレッドがオブジェクトの読み取りと同時にオブジェクトの文字列プロパティを更新するのを防ぎます(おそらく、ロックの使用を再検討する必要がありますか?)。
とにかく、私の懸念は、自分のスレッドでコピーされたオブジェクトへのポインターを逆参照する複数のサブスクライバーにあります。オブジェクトの有効期間を制御するにはどうすればよいですか?すべてのサブスクライバーがオブジェクトを処理し、オブジェクトを安全に削除できることをどのように知ることができますか?
ヒントや方向性を事前に感謝します、
-エド
c# - シングルトンファクトリー、一種
これが他の場所で回答されている場合は申し訳ありません...似たようなものについて多くの投稿を見つけましたが、同じではありません。
オブジェクトのインスタンスが一度に 1 つしか存在しないようにしたいのですが、Singleton パターンの場合のように、そのオブジェクトが自然なライフサイクルを超えて保持されることは望ましくありません。
リストの処理が(私が制御できない外部コードによって)トリガーされるコードを書いています。現在、毎回新しい「処理」オブジェクトを作成するだけで、通常どおり、スコープ外になると破棄されます。ただし、処理に 1 分以上かかる場合があるため、次のトリガーによって新しいスレッドで処理クラスの 2 番目のインスタンスが作成されます。
ここで、一度に 1 つのインスタンスしか存在できないメカニズムが必要です...たとえば、一度に 1 つのオブジェクトのみを許可するある種のファクトリです。ファクトリへの 2 回目の呼び出しは、新しいオブジェクトの代わりに null を返します。
これまでのところ、私の(くだらない)解決策は、プロセッサ クラスのネストされたクラスとして Factory タイプのオブジェクトを使用することです。
「instanceExists」フィールドを false にリセットする XmlJobListProcessor クラスの明示的なデストラクタを作成することを考えていました。
私はこれが非常にひどい設計であることを認識しています。ファクトリはそれ自体がクラスである必要があります...それとインスタンスデストラクタの両方が揮発性ブール値にアクセスできるようにネストされているだけです...
これを行うためのより良い方法はありますか?乾杯