問題タブ [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.

0 投票する
8 に答える
15532 参照

.net - Marshal.AllocHGlobal によって割り当てられたメモリをゼロにする方法は?

経由でアプリケーションにアンマネージ メモリを割り当てていますMarshal.AllocHGlobal。次に、一連のバイトをこの場所にコピーし、結果のメモリ セグメントを に変換してから、structを介してメモリを再度解放しますMarshal.FreeHGlobal

メソッドは次のとおりです。

これはほとんどの場合機能しますが、struct必要なサイズよりもバイト数が少ない場合、最後のフィールドに「ランダムな」値が割り当てられます(LayoutKind.Sequentialターゲット構造体で使用しています)。これらのぶら下がっているフィールドをできるだけ効率的にゼロにしたいと思います。

コンテキストとして、このコードは Linux 上の C++ から送信された高頻度のマルチキャスト メッセージを逆シリアル化しています。

失敗したテスト ケースを次に示します。

このテストを繰り返し実行すると、2 番目のアサートが毎回異なる値で失敗します。


編集

最後に、私はleppie の提案である をunsafe使用しstackallocました。これにより、必要に応じてゼロに設定されたバイト配列が割り当てられ、メッセージ サイズに応じてスループットが 50% から 100% の間で改善されました (メッセージが大きいほどメリットが大きくなります)。

最終的な方法は次のようになりました。

Marshal.PtrToStructure残念ながら、これには、バイトをターゲット型に変換するための呼び出しが必要です。

0 投票する
1 に答える
1274 参照

c# - C#でマネージストリームをuint配列に直接読み込む方法は?

実際には uint 形式のストリームにデータがあります。System.IO.Stream では、コンテンツをバイト配列に読み取ることしかできませんが、バイトを読み取ってからバイト配列の長さの 1/4 の uint 配列に変換したくありません。時間を節約するために、uint 配列のメモリに直接読み込みたいと思います。

アンマネージ C++ の場合は、とても簡単です。ポインターを uint 配列に送信するだけで完了します。しかし、C# ではそれほど単純ではないようです。別の uint 配列と同じメモリ アドレスを持つバイト配列を生成し、そのバイト配列を Stream.Read() のパラメーターとして送信して、Stream.Read() がバイト配列に書き込むときにコンテンツがちょうどuint配列でも。しかし、私は Marshall クラスを調べましたが、これまでのところ、この問題の解決策は見つかりませんでした。何か案は?

0 投票する
2 に答える
160 参照

c# - システム固有のバグハンティング?

私は最近、マルチメディアライブラリであるSFMLをいじっています。私は C# を使用しているので、当然のことながら、最新の 2.0 バージョンで SVN から取得できる .Net バインディングを使用しました。しばらくいじり回した後、Text オブジェクト (テクスチャ フォントの描画に使用されるオブジェクト) を使用しているときに、アプリケーションがハングアップすることがあることに気付きました。

プロファイラーと万能の Windows タスク マネージャーを使用してさらに調査を行ったところ、Text を使用する単純なアプリケーションが何らかの形でメモリ リークを起こしているように見えることが明らかになりました。それから、SFML フォーラムでそれに関するスレッドを作成しました (スレッド)。しかし、SFML の主な開発者は、自分のマシンでバグを再現できませんでした。私は気が狂っているはずがないと思って、それを友人に送ったところ、彼は実際にそれが起こっているのを見たと報告しました.

SFML の開発者である Laurent のためにサンプルを作成しましたが、それでも彼はバグを再現できませんでした。これは OS に関連している可能性があると考えて、ファイルを可能なすべての人に送信し、OS について問い合わせました。ここに私の結果があります:

http://spreadsheets.google.com/ccc?key=0AhcHeJlLGEVUdG1TTi1mTkFxeFlHYVRISXhjbFBDUmc&hl=ja

ご覧のとおり、Turc と K7 はどちらも同じ OS ですが、K7 ではクラッシュしません (テスト候補がまだ報告されていないため、表は不完全です)。とにかく、これは明らかに OS の問題ではないことを示しています。

だから私の実際の質問は、OS やアーキテクチャ以外の他の要因が、特定のシステムにのみ現れるこのようなバグに影響を与える可能性があるということです。

参考までに、友人に送ったファイルを以下に示します: http://dl.dropbox.com/u/3310651/MemLeak2.rar

そして、私が行ったプロファイリングのスクリーンショット: http://dl.dropbox.com/u/3310651/sfml_memleak.png

ありがとう!

0 投票する
2 に答える
595 参照

c# - C#/.NET: ネットワーク用の UnmanagedMemoryStream?

ネットワーク サーバーで受信 (およびおそらく送信) パケットを処理するために、MemoryStream ではなくUnmanagedMemoryStreamを使用することを検討していました。私が達成したいのは、値のコピーを減らし、可能であれば、ヒープへのコピーを避けることです (多すぎます)。

たとえば、着信パケットの場合、次のことができます。

それでも、これを行うことに現実的な利点があるかどうかはよくわかりません。古き良き管理された MemoryStream を使用するのではなく、これを行うことに価値があるかどうかについて、誰かフィードバックをいただけますか?

前もって感謝します。

0 投票する
1 に答える
1307 参照

pointers - C++/CLI のマネージド クラスのアンマネージド オブジェクトにアンマネージド ポインターを渡す

次の状況を想定してみましょう。

C++/CLI コードで割り当てられた (および入力された) std::vector へのポインターをアンマネージ C++ に渡したいと考えています。単純に書くa->AnotherMethod(b)と、ベクトルはアンマネージ コードでは空です (たとえば、C++/CLI では 4 つの要素があり、a.

それを行う適切な方法は何ですか?

0 投票する
2 に答える
235 参照

c# - 管理されたデータ配列の _msize()?

malloc で割り当てられた char など、データ配列へのポインターの配列を取るネイティブ関数があります。

マネージド コードでは、PInvoke を介してその関数に渡す byte[] 配列の列挙があります。

ただし、ネイティブ コードで _msize を呼び出すと、ヒープが破損します。1 次元配列 char* と連結された byte[] 配列を組み合わせて stackalloc を使用したことを覚えています。しかし、さまざまなサイズの個々の byte[] 配列を使用した「ジャグ配列」のサポートが必要であるため、ポインター char** の配列が必要です。

_msize が stackalloc の場合のように正しく機能するように byte[] 配列を固定する方法は?

0 投票する
2 に答える
289 参照

c# - インスタンスの作成時に、アンマネージメモリはシステムにどのように割り当てられますか?

COMオブジェクトまたはその他のアンマネージインスタンスがC#から作成される場合、アンマネージメモリはシステムにどのように割り当てられますか?

0 投票する
2 に答える
829 参照

functional-programming - ガベージコレクションを持たない関数型言語はありますか

または、非機能的/非メモリ管理言語での高度に機能的なスタイルですら。中間ゴミのような問題に対処するためにどのような技術がありますか?割り当てられたメモリを遅延化/サンクした後のクリーンアップ。パフォーマンス(割り当てを解除するために進行状況を追跡する必要がある場合、不変変数間でリソースを簡単に共有できないため(スマートポインター?)

0 投票する
1 に答える
826 参照

.net - アンマネージ コンポーネントが割り当て/割り当て解除に使用するメモリ領域

.net マネージド アプリケーションが、InterOP を介してアンマネージド コンポーネントと相互作用するとします。メモリの問題をデバッグする必要がある場合。管理されていないコンポーネントが正確にどこにメモリを割り当てますか? GCで使用されているのと同じヒープですか(私は疑問です)、それとも他の領域ですか? Windbg のデバッグを行っていますが、!dumpheap のような SoS コマンドを介してアンマネージ コンポーネントによる割り当てを確認できるかどうか疑問に思っています。

0 投票する
1 に答える
872 参照

c# - ActiveX コンポーネント dynavis を介した .net でのアンマネージ メモリ リーク

メモリ リークの原因となる .Net より前の時代にのみ作成された ActiveX コンポーネントを使用しています。すべての .Net 関連インスタンス (AxHost など) は適切に解放されますが、アンマネージ メモリは増え続けます。(.Net mem プロファイラーによる)

.Net 内からアンマネージ メモリを強制的に解放する方法はありますか? これは、手に負えない ActiveX コンポーネントを処理する方法で解決できるのでしょうか?

コンポーネントは Dynavix 2 (dyDisplay、PictureDocument、AxDYNAview) です。