- - PR -
[C#] ガベージコレクタの影響を受けないメモリ領域を確保したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-08-18 11:51
ガベージコレクタの影響を受けない連続のメモリ領域を確保したいのです。
領域を確保してから、明示的に指示して開放するまで固定しつづけたいです。 特定のブロック内だけで局所的にアドレスを固定させるだけでは不十分で、 広範囲なスコープでの固定が必要なのです。(長さは数十キロバイト程度) 必要な操作は下記の4種類 (1) 領域を確保する方法 確保する長さをbyte数で指定し、先頭アドレスを返して欲しい (2) 領域を開放する方法 (3) 値を書き込む方法 (4) 値を読み出す方法 ※(3)(4)についてはint[]経由で操作できるなら尚ありがたいです。 宜しくお願いします。 | ||||
|
投稿日時: 2004-08-18 12:12
確保して、参照されているアドレスはガベージコレクタによる解放の対象になりませんが???
PInvokeして、GlobalAlloc()とか。 | ||||
|
投稿日時: 2004-08-18 12:35
Jittaさんも言われていますが、参照されている限り、GCによる開放は無いです。 static変数で確保しておけば大丈夫かと。 もし、これがUnmanagedな関数にメモリ領域のアドレスを渡したいとなると、 確かにメモリ領域を固定する必要はあります。 その場合は、Marshal.AllocHGlobalを使って確保すればいいです。 Marshalクラスのメソッドを参照してみてください。 メモリへの読み書きはIntPtrをint*等にキャストすればいいです。 | ||||
|
投稿日時: 2004-08-18 13:09
回答ありがとうございます。
バックでバスマスター方式のボードを使って書き込みをさせようとしています。 CPU(C#)が知らないどころで、書き込ませなければならないので、 Marshialクラスのメンバーが必要になりそうです。 |
1