問題タブ [dangling-pointer]
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++ - インタープロセス COM オブジェクトに対して、QueryInterface を使用せずに IDispatch* を IUnknown* にキャストしても安全ですか?
COM
インタープロセスオブジェクトを扱う場合、 を使用せずに をにキャストIDispatch*
しても安全ですか?IUnknown*
QueryInterface
ここで、IDispatch
オブジェクトは他のプロセスから取得されますOtherProcess.exe
。そして、私の同僚は、 を得るために に電話QueryInterface
するべきだと言っています。IDispatch
IUnknown
現在、私はやっています:
彼の提案に関する私の問題: 私は、OtherProcess.exe がクラッシュしたか強制終了された場合 (アクセス違反) に対処しています。この存在しない OtherProcess.exe からオブジェクトをカプセル化するInvoke
on のような関数を呼び出すと、これらのアクセス違反が引き起こされるようです (編集:コメントと回答は、この最新の仮定が完全に誤りであったことを示しています!)。IDispatch
そのため、 as パラメーター::CoIsHandlerConnected(pIUnknown);
を取るアプリケーションのテストを保護しようとしています。IUnknown
しかし、同僚が私にアドバイスするように、QueryInterface
を呼び出すことによって、私が解決しようとしている同じ問題に戻ることを 恐れています: これは、もはや存在しないオブジェクトを処理します。 (もう一度編集します。この仮定も誤りです)。IDispatch
IDispatch
QueryInterface
IUnknown
キャストをするだけで本当に間違っていますか?死んだプロセス間COM
オブジェクトを処理する一般的な方法は何ですか?
これは、OAIdl.h 内の の定義の始まりであり、IDispatch
から派生したものとして宣言されていIUnknown
ます。
pointers - 参照はポインターの問題を解決しますか?
こんにちは私は参照を使用して非常に混乱しています。ポインターの代わりに参照を使用すると、ダングリングやメモリ リークの問題さえも解決するでしょうか?
delphi - Delphi のダングリング ポインタ
私はインターフェイスを使用していません (そのため、オブジェクトには参照カウントがありません)。オブジェクトは他の多くのオブジェクトから参照される可能性があり、ダングリング ポインターを処理する必要があります。FreeAndNil() は、複数の参照の問題を解決しません。オブジェクトが破棄されると、それを参照するすべてのポインターが自動的に nil に設定される必要があります。あるいは、C++ の std::weak_ptr の Expired() メソッドのようなものかもしれません。
これを行うために「弱いスマートポインター」を実装できますが、それが複雑すぎる実装であるかどうかはわかりません。別の解決策を提案しますか?これは私が考えているテストされていない可能な解決策です:
c++ - ポインターの削除と nullptr への設定の違いは何ですか?
と言っdelete pointer
てpointer = nullptr
同じですか?おそらくそうではありませんが、後者はメモリを解放しますか? delete pointer; pointer = nullptr
/はどうpointer = nullptr; delete pointer
ですか?通常は別の機会に削除され、通常の削除でエラーが発生する場合に、必要に応じて途中でポインターを削除する安全な方法を作成するためにそれを使用しないのはなぜですか?
c++ - unique_ptr::operator*() の安全な代替手段がないのはなぜですか?
std::vector
at()
は、の安全な代替手段としてメンバー関数を持っているoperator[]
ため、境界チェックが適用され、ダングリング参照が作成されません。
ただし、std::unique_ptr
対応する機能がありません。
このような安全な代替手段があればstd::unique_ptr
、たとえば member ref()
(and cref()
) のように、ぶら下がっている参照を返すことはなく、例外をスローすることができれば、それは素晴らしいことです。可能な実装:
標準がこの種のものを提供しない正当な理由はありますか?
c++ - 異なるデータ型のダングリング ポインターが指すメモリ位置にデータが書き込まれるとどうなるか
ポインタのデータ型が新しく入力されたデータと同じであればエラーにはならないと思いますが、ポインタのデータ型が異なると型の不一致が発生します。私は、コンパイラがそれについて何かをするか (最初にダングリング ポインターを削除するなど)、または単にエラーを与えるかどうか疑問に思っていました。
c++ - flatbuffers: root-pointer 経由でバッファを削除することは可能ですか?
私はフラットバッファライブラリを使い始めています。しかし、バッファの削除に関しては、私にとって不快に感じることがあります。ルートポインタ要素を介してバッファを削除する方法がわかりません。これが可能であれば、ルート ポインターは割り当てられたスペースの所有権を取得でき、寿命の問題 (ルート ポインターのぶら下がり、メモリ リークなど) を気にする必要はありません。
Q: 可能ですか (おそらく、モンスターは可変ではないなどの制限の下で)、delete_buffer のようなものを書きます