ふと思ったのですが…新規で予約開始アドレスが0x0だったら?ありえないと思うのですが、なぜでしょうか?新しいオペレーターはその準備ができていますか?最初のバイトのその部分は使用できませんか? OSの起動時に常に予約されていますか?
ありがとう!
ふと思ったのですが…新規で予約開始アドレスが0x0だったら?ありえないと思うのですが、なぜでしょうか?新しいオペレーターはその準備ができていますか?最初のバイトのその部分は使用できませんか? OSの起動時に常に予約されていますか?
ありがとう!
ヌル ポインターは必ずしも address0x0
ではないため、アーキテクチャが別のアドレスを選択してヌル ポインター0x0
を表し、new
有効なアドレスとして取得できる可能性があります。(誰もそれをしていないと思いますが、ところで、それは大量のmemset
呼び出しの背後にあるロジックを壊し、とにかく実装するのが難しくなります)。
null ポインターがOperative Systemによって予約されているか、C++ 実装によって予約されているかは指定されていませんが、そのアドレスが何であれ、plainはnull ポインターnew
を返すことはありません( notrowは別の獣です)。だから、あなたの質問に答えるには:new
メモリアドレス 0x0 は使用可能ですか?
たぶん、特定の実装/アーキテクチャに依存します。
「初期」メモリ アドレスは通常、オペレーティング システム用に予約されています。OS は、初期の物理メモリ アドレスを使用して、ユーザー プログラムが使用する仮想メモリ アドレスと一致させません。OS によっては、割り込みベクトル テーブル、ページ テーブルなど、多くのものが存在する可能性があります。
これは、Linux における物理メモリと仮想メモリのレイアウトの特定されていないグラフです。ディストリビューションごと、リリースごとにわずかに異なる可能性があります。
http://etutorials.org/shared/images/tutorials/tutorial_101/bels_0206.gif
^グラフィックに惑わされないでください - ブートローダーは物理メモリにはありません...なぜそれが含まれているのかわかりません...しかし、それ以外は正確です.
仮想メモリが 0x0 までマップされない理由を尋ねていると思います。最大の理由の 1 つは、ポインターの割り当てに失敗したときに痛々しいほど明白であるためです。0x0 の場合、それは「何もない」ことを指しており、常に間違っています。
もちろん、NULL が任意の値になる可能性はありますが (実装に依存するため)、初期化されていない int の値は 0 であるため、私が見たすべての実装では、一貫性のために NULL 0 を保持することを選択しました。
他にもたくさんの理由がありますが、これは良い理由です。これは、仮想アドレス指定についてもう少し説明しているウィキペディアの記事です。
デバッグに役立つように、多くのメモリ アドレスがシステムによって予約されています。
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 によってアプリケーションに割り当てられる論理メモリ アドレスには違いがあります。ここに示されている例の画像。