問題タブ [unmanaged-memory]
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#の任意のメモリ位置への生のポインタの有効な使用法
次のコードでは、任意のメモリ位置にある構造体へのポインタを作成します。
f4
の型をobject
のではなくに変更するint
と、エラーコンパイラエラーCS0208が発生します:のアドレスを取得できない、サイズを取得できない、または管理対象型('type')へのポインタを宣言できません。
(だけでなく)レベルstruct S
で、そのタイプでポインターを構築できるようにするための制約は何ですか?CIL
C#
MSDNのこのページには、、、、、、、、、、、、、、、、列挙型とポインタが許可されているほかsbyte
、 「アンマネージ型のフィールドのみを含むユーザー定義の構造体型」と記載されていますが、アンマネージ型の項目は指定されていません。タイプはです。byte
short
ushort
int
uint
long
ulong
char
float
double
decimal
bool
c# - この IntPtr は、割り当てられたアンマネージ メモリを指していますか?
まず、メモリを割り当ててポインターを取得します。
次に、ポインターが指すメモリを解放しようとします。
しかし、私のアプリケーションでは、「メモリフラグメントが破損しています」という説明だけで、致命的な未知の例外が発生することがあります。これは、別のポインターを解放することによって、既に割り当て解除されているメモリ ブロックを指すポインターを解放しようとするためだと思います...
私の質問は: IntPtr ポインターを使用して、メモリ ブロックがまだ割り当てられているか、または既に割り当て解除されているかを確認する方法はありますか?
c# - Unlocked Bitmap アンマネージ メモリ (Scan0) を直接読み書きする
ロックされていないビットマップ アンマネージ メモリから直接読み書きしてもよろしいですか?
Bitmap の UnlockBits 後、BitmapData を使い続けることはできますか? 別のスレッドが同じビットマップにピクセルを書き込んでいる間に、マウス位置で PictureBox のビットマップのピクセルを読み取ることができるテスト アプリを作成しました。
編集 1:Boing
彼の回答で指摘されているように、「Scan0 は Bitmap オブジェクトの実際のピクセル データを指していません。むしろ、Bitmap オブジェクトのピクセル データの一部を表す一時バッファを指しています。」MSDNから。
しかし、Scan0 を取得すると、Lockbits や UnlockBits を必要とせずに Bitmap を読み書きできるようになります。私はこれをスレッドで何度もやっています。MSDN によれば、Scan0 は Bitmap データの COPY を指しているため、これは発生しないはずです。C# では、すべてのテストでコピーではないことが示されます。C++ では、正常に動作するかどうかわかりません。
編集 2:回転メソッドを使用すると、OS がビットマップ ピクセル データのコピーを解放することがあります。結論、it is not safe to read/write an unlocked Bitmap Scan0
。Boing さん、回答とコメントをありがとうございます。
以下は、BitmapData を取得し、ピクセル値を読み書きする方法です。
c# - 管理されていない配列を指す IntPtr を適切に解放する方法は?
アンマネージ コードで使用する構造体の配列を指す IntPtr を割り当てます。このテーマに関する多くのリソースを見つけました。これが私の最終的な方法です(うまくいくようです):
今私の質問:
- この結果の IntPtr ポインターを適切に解放するにはどうすればよいですか? (FreeHGlobal(ポインタ)で十分ですか?)
- x86 または x64 システム/アプリケーション プラットフォームを使用する場合に注意すべきことはありますか?
文字列の配列 (C の char**) に対する同じ質問:
c# - 文字列の配列をアンマネージ char double ポインターにコピーするにはどうすればよいですか?
CコードでNx128マトリックスchar**
として割り当てられているC構造体にaがあります。C# には文字列の配列があり、何も再割り当てせずに、この配列を char double ポインターにコピーしたいと考えています。私はこれを試しました:
しかし、これはうまくいきません。誰かがそのようなコピーを実行する方法を知っていますか?
アップデート:
char** names
myが C コードで 3 つの項目にどのように割り当てられるかを次に示します。names = (char **) MallocArray2D (3, 128, sizeof ( char ));
MallocArray2D
メソッドの詳細は次のとおりです。
このMallocArray2D
メソッドはMallocImage
、C# コードで公開されている に呼び出されます。
MallocImage
Cコードのメソッドの興味深い部分は次のとおりです。
今私のC#公開MallocImage
メソッド:
c# - BYTE * C# の配列
アンマネージ関数を呼び出そうとしています。私はC++からそれを呼び出しました:これは私と一緒に働いているテストプロジェクトです
しかし、私がC#でそれを呼び出すと:
最初のバイトのみを取得します
asp.net - なぜ (そしてどのように) ASP.NET キャッシュがアンマネージ メモリに格納されるのですか?
OK、ASP.NET エキスパートの皆さん: リフレクターを使用して ASP.NET キャッシュの実装 (上にHttpRuntime.Cache
あり、HttpContext.Current.Cache
) をHashtable
内部で使用してキャッシュを保持しています。
ただし、データはアンマネージ メモリに格納されます。アンマネージ メモリにデータが格納されているのを確認できなかったので、これは非常に奇妙です。ただし、バイト配列のチャンクをキャッシュに挿入する非常に単純な Web アプリケーションを作成すると、次のようになります。
- プライベート バイト: 460MB
- 全ヒープのバイト数: 150MB
=>
管理メモリ: 150 MB
アンマネージド メモリ: 310 MB
したがって、基本的に私はアプリケーションを何度も呼び出しています (それぞれの増加は 1000x リクエストで、それぞれ 64KB の空のバッファbyte[]をキャッシュに入れます)。そのため、最も大きくなったのは、すべてのヒープ(マネージ メモリ)内のバイトではなく、プライベート バイト(合計メモリ) です。ただし、Hashtable を使用してマネージ ヒープにオブジェクトを追加しているため、マネージメモリは総メモリ量に合わせて増加すると予想しています。
この振る舞いを説明していただけますか?
アップデート
サイモンが言ったように、すべてのヒープ値のバイトはガベージ コレクションの後にのみ変更されます。コードを変更してガベージ コレクションを誘導し、カウンターを更新しました。Gen 2 ヒープ メモリの増加は、追加されたメモリの量とまったく同じです。ただし、アンマネージ メモリは依然としてはるかに高くなっています。この例では、合計メモリが 231 MB であるのに対し、ヒープ 2 はわずか 96 MB でした。