0

アクセス違反の例外を取得せずに、プログラムに割り当てられたメモリの外側にあるメモリ チャンクにアクセス (読み取りまたは解放) する方法はありますか。これとは別に、私が実際に理解したいのは、メモリ クリーナー (システム ガベージ コレクター) のしくみです。そんなプログラムを書きたいとずっと思っていました。(言葉は問いません)

前もって感謝します :)

4

3 に答える 3

6

いいえ。

最新のオペレーティング システムは、あるプロセスが別のプロセスに属するメモリにアクセスすることを防ぎます。

実際、仮想メモリを理解していれば、これは不可能であることがわかります。各プロセスには、独自の仮想アドレス空間があります。

于 2010-04-11T15:56:00.410 に答える
1

簡単な答えは(私が間違っているわけではありませんが)、いいえです。一般的に、2 つの理由から、これは良い考えではありません。1 つ目は、あなたのプログラムと他のプログラムとの間で信頼の問題が発生するためです (言うまでもなく、私たち人間もあなたのアプリケーションを信頼しません)。2 つ目は、別のアプリケーションのメモリにアクセスして、アプリケーションが知らないうちに変更を加えることができた場合、アプリケーションをクラッシュさせることです (ウイルスもこれを行います)。

ガベージ コレクターは、ランタイムから呼び出されます。ランタイムはメモリ空間を「所有」し、他のアプリケーションがそのメモリ空間内で「生活」できるようにします。これがガベージコレクタが存在できる理由です。OSがメモリを割り当てるランタイムを作成し、ランタイムにその権限の下でアプリケーションを実行させ、その権限の下でGCも使用する必要があります。アプリケーション開発者が(OSではなく)ランタイムからメモリを「リクエスト」できるようにするインストルメンテーションまたはAPIを許可する必要があり、ランタイムはそのようなリクエストに応答するだけでなく、メモリスペースを追跡する方法もありますそのアプリケーションに割り当てます。おそらく、フレームワーク (DLL のセット) が必要になるでしょう。

実行中のアプリケーションが使用するメモリ以外のメモリをガベージ コレクタが削除しないようにする必要があります。これは、ランタイム内で複数のアプリケーションを同時に実行している可能性があるためです。

お役に立てれば。

于 2010-04-11T16:00:41.553 に答える
1

実際には正しい答えはイエスです..それを行うプログラムがいくつかあります(そして、それらが存在する場合..それは可能であることを意味します...)これを達成するにはカーネルドライブを作成する必要があるかもしれませんが、可能です。

ああ、別の例があります... Debugger attach コマンド... これは、別のプログラム メモリと対話する 1 つのプログラムですが、両方とも別のプロセスとして開始されています....

もちろん-別のプログラムメモリをいじっています..何をしているのかわからない場合は、おそらくクラッシュします...

于 2010-04-11T16:10:47.643 に答える