- PR -

[C#] ガベージコレクタの影響を受けないメモリ領域を確保したい

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-08-18 11:51
ガベージコレクタの影響を受けない連続のメモリ領域を確保したいのです。
領域を確保してから、明示的に指示して開放するまで固定しつづけたいです。
特定のブロック内だけで局所的にアドレスを固定させるだけでは不十分で、
広範囲なスコープでの固定が必要なのです。(長さは数十キロバイト程度)

必要な操作は下記の4種類
(1) 領域を確保する方法
  確保する長さをbyte数で指定し、先頭アドレスを返して欲しい
(2) 領域を開放する方法
(3) 値を書き込む方法
(4) 値を読み出す方法
※(3)(4)についてはint[]経由で操作できるなら尚ありがたいです。

宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-18 12:12
 確保して、参照されているアドレスはガベージコレクタによる解放の対象になりませんが???

 PInvokeして、GlobalAlloc()とか。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-08-18 12:35
引用:

ひろしさんの書き込み (2004-08-18 11:51) より:
ガベージコレクタの影響を受けない連続のメモリ領域を確保したいのです。


Jittaさんも言われていますが、参照されている限り、GCによる開放は無いです。
static変数で確保しておけば大丈夫かと。

もし、これがUnmanagedな関数にメモリ領域のアドレスを渡したいとなると、
確かにメモリ領域を固定する必要はあります。
その場合は、Marshal.AllocHGlobalを使って確保すればいいです。
Marshalクラスのメソッドを参照してみてください。
メモリへの読み書きはIntPtrをint*等にキャストすればいいです。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-08-18 13:09
回答ありがとうございます。
バックでバスマスター方式のボードを使って書き込みをさせようとしています。
CPU(C#)が知らないどころで、書き込ませなければならないので、
Marshialクラスのメンバーが必要になりそうです。
1

スキルアップ/キャリアアップ(JOB@IT)