2015-11-03 12 views
5

私は静的なImageListオブジェクトを持つC#クラスを持っています。この画像リストは、アプリケーション内のいくつかのフォーム上のさまざまなListViewヘッダー(SendMessage ... HDM_SETIMAGELIST経由)と共有されます。静的なクラスメンバは固定されていますか?

静的オブジェクトはガベージコレクションに適格ではないことは理解していますが、ガベージコレクタによる再配置(圧縮)もできないかどうかはわかりません。このオブジェクトは、GCHandle.Allocを使用してアンマネージコードと共有されているため、このオブジェクトを固定する必要がありますか?

環境はVS 2008、Compact Framework 3.5です。

+0

私は自分自身はわかりませんが、移動しそうにない場合でも固定されているとは限りません。それは、他のオブジェクトがそれらの周りで解放されるにつれて、圧縮のために移動される可能性が非常に高いようです。 – siride

答えて

0

それはGCHandle.Allocを使用して、たとえば、非管理 コードと共有されているので、私もこのオブジェクトを確保する必要がありますか?

はい。ポインタが固定されていない場合、GCはそのメモリを自由に移動できるので、有効でないか悪いかのいずれかを指し示すポインタがC++ついている可能性があります。

また、「共有」語を明確にする必要があります。それをどこかにコピーする非管理メモリに割り当てて渡すと、それらを常に固定するのを避けることができます。管理されていない環境に制御を渡すとどうなるかによって異なります。でも@Brianから興味深い答えを考慮

EDIT

、私はまだポインタをピン留めを選ぶでしょう。コード内で固定ポインタの概念を明示するには、今後のコードのメンテナンスにおける誤ったガイドを避け、明確にしてください。

0

はい。オブジェクトを固定する必要があります。

リファレンスは静的ですが、参照元のメンバーがどこでもGCハンドルであればどこにでもアクセスできます。つまり、ガベージコレクション(および/または圧縮)の対象ですが、もちろんそれは起こりません。

静的修飾語は最終的にはメモリ内に静的な場所があることを暗示するとは必ずしも間違っているとは思っていませんが、大きな問題は、メモリアドレスを取得せずにメモリアドレスを取得できるオブジェクト。それがGCによって動かされているかどうか。

さらに、各静的メンバーは、AppDomainごとに(プロセスではなく)一意です。同一の静的メンバは、同じプロセス内の異なるメモリ位置に存在する可能性があり、AppDomainがアンロードされるとガベージコレクションされる可能性があります。これは私が認められる非常に端の場合ですが、固定しなくてもオブジェクトを固定しないという本当の利点はありません。

+0

My ImageListオブジェクトは、Handleプロパティを公開します。これは、AddrOfPinnedObject()によって返された値ではなく、アンマネージコードに渡すものです。 Handleプロパティ(struct IntPtr)またはImageListオブジェクト全体を固定する必要がありますか? – dablumen

+0

'AddrOfPinnedObject()'メソッドを使って、オブジェクトにアクセスするためにオブジェクトを固定する必要があります。ただし、** blittable **の配列でない場合は、管理対象オブジェクトへの未処理のポインタになります。私はあなたがそうするべきであるように、あなたが非blittable型でこれを行うならば、実際にあなたが例外を取得すると思います。ハンドルを直接渡すことは 'GCHandle'の周りのラッパーである' gc_root'を渡すことであり、アンマネージドコードからのアクセスに必要に応じてそれに応じて動作します。 –

2

インスタンス自体は静的ではありません。参照はです。参照をnullにすると、インスタンスはGCに適格になります。内部的には、すべての静的インスタンスは、固定されたハンドルを介して静的配列に参照されます。私。インスタンスはランタイムによって暗黙的に固定されます。

あなたは静的メンバとして宣言されたインスタンスのGCrootを見れば、あなたはこのような何か表示されます:あなたは、静的参照をゼロならば、ピン配列内の対応するエントリは次のようにゼロになり

HandleTable: 
    008113ec (pinned handle) 
    -> 032434c8 System.Object[] 
    -> 022427b0 System.Collections.Generic.List`1[[System.String, mscorlib]] 

をよく

これは明らかに実装の詳細なので、潜在的に変更される可能性があります。

+0

興味深いです。実装にいくつかの内部がありますか? (記事、ブログ..)あなたが参照している主題に関する情報があまりないように見えるからです。 – Tigran

+0

これは私が想定している実装の詳細ですが、WinDbg/SOSを使用してこれを掘り下げて静的なことをこのように扱うことができます。 –

+0

これは現在の実装の詳細ですか?それとも、これは最初からほとんどありますか?言い換えれば、これは潜在的にも変更される可能性がありますか? (潜在的に破壊されるレガシーコードを犠牲にしても、もし誰かが彼のミックスコードに暗黙の固定を中継していた場合) – Tigran

関連する問題