6

ふと思ったのですが…新規で予約開始アドレスが0x0だったら?ありえないと思うのですが、なぜでしょうか?新しいオペレーターはその準備ができていますか?最初のバイトのその部分は使用できませんか? OSの起動時に常に予約されていますか?

ありがとう!

4

4 に答える 4

12

ヌル ポインターは必ずしも address0x0ではないため、アーキテクチャが別のアドレスを選択してヌル ポインター0x0を表し、new有効なアドレスとして取得できる可能性があります。(誰もそれをしていないと思いますが、ところで、それは大量のmemset呼び出しの背後にあるロジックを壊し、とにかく実装するのが難しくなります)。

null ポインターがOperative Systemによって予約されているか、C++ 実装によって予約されているかは指定されていませんが、そのアドレスが何であれ、plainはnull ポインターnewを返すことはありません( notrowは別の獣です)。だから、あなたの質問に答えるには:new

メモリアドレス 0x0 は使用可能ですか?

たぶん、特定の実装/アーキテクチャに依存します。

于 2013-01-18T21:43:07.157 に答える
3

「初期」メモリ アドレスは通常、オペレーティング システム用に予約されています。OS は、初期の物理メモリ アドレスを使用して、ユーザー プログラムが使用する仮想メモリ アドレスと一致させません。OS によっては、割り込みベクトル テーブル、ページ テーブルなど、多くのものが存在する可能性があります。

これは、Linux における物理メモリと仮想メモリのレイアウトの特定されていないグラフです。ディストリビューションごと、リリースごとにわずかに異なる可能性があります。

http://etutorials.org/shared/images/tutorials/tutorial_101/bels_0206.gif

^グラフィックに惑わされないでください - ブートローダーは物理メモリにはありません...なぜそれが含まれているのかわかりません...しかし、それ以外は正確です.

于 2013-01-18T21:39:50.520 に答える
2

仮想メモリが 0x0 までマップされない理由を尋ねていると思います。最大の理由の 1 つは、ポインターの割り当てに失敗したときに痛々しいほど明白であるためです。0x0 の場合、それは「何もない」ことを指しており、常に間違っています。

もちろん、NULL が任意の値になる可能性はありますが (実装に依存するため)、初期化されていない int の値は 0 であるため、私が見たすべての実装では、一貫性のために NULL 0 を保持することを選択しました。

他にもたくさんの理由がありますが、これは良い理由です。これは、仮想アドレス指定についてもう少し説明しているウィキペディアの記事です

于 2013-01-18T21:39:31.517 に答える
1

デバッグに役立つように、多くのメモリ アドレスがシステムによって予約されています。

0x00000000 Returned by keyword "new" if memory allocation failed

0xCDCDCDCD Allocated in heap, but not initialized

0xDDDDDDDD Released heap memory.

0xFDFDFDFD "NoMansLand" fences automatically placed at boundary of heap memory. Should never be overwritten. If you do overwrite one, you're probably walking off the end of an array.

0xCCCCCCCC Allocated on stack, but not initialized

しかし、他の何人かが指摘しているように、OS が使用する物理メモリ アドレスと、OS によってアプリケーションに割り当てられる論理メモリ アドレスには違いがあります。ここに示されている例の画像。

于 2013-01-18T21:51:33.377 に答える