1

私はこの本を 2 度目に読んでいます:「C++ 入門書プラス」と 1 つのことが私の目を引いた: http://imgur.com/K73bnK9

多くの場合、メモリは線形ブロック(1)のように表されます。たとえば、(2) でメモリの 2 つの新しいブロック "a" と "b" を割り当て、(3) で "a" を削除するとします。矢印は、本/チュートリアルに従ってメモリを解放するためのポインターです。今、これらは私の質問です:

  • 空きメモリへのポインタが 2 つあるのですか、それとも 1 つだけですか?
  • ポインターを 1 つしか持てず、そのポインターがブロック "a" を指している場合 (これは再び解放されます)、さらに多くのメモリを割り当てたい場合は、"a" で使用できるようになりますか?

編集:メモリ割り当てが実際に舞台裏でどのように機能するかを理解しようとしているので、「int i=0;」と入力するとどうなるかを詳しく知りたいと思います。または「ながら(実行中)」。

4

2 に答える 2

-1

動的メモリ割り当ては、質問で提示したものとは少し異なります。メモリの 2 つのブロックを別々に割り当てる場合、それらは必ずしも隣接しているわけではありません。それらを同じnewステートメント (または配列の一部などstruct) で割り当ててから、そのうちの 1 つだけを削除すると、それらは隣接することになりますが、これは非常に奇妙なことです。

の構文を見てくださいnew:

int* a = new int;

演算子は、new実際に割り当てられたメモリへのポインターを返し、それをポインターに格納しますa。2 回呼び出すと、メモリの 2 つの異なるブロックへの 2 つの異なるポインターが取得されます。

配列を割り当てている場合は、配列の最初の要素へのポインターを 1 つ取得します。ただし、呼び出しはポインターdeleteを取り除くのではなく、ポインターが指すものを取り除きます。したがって、(配列全体ではなく) の最初の要素を削除した場合、メモリにアクセスしようとすると未定義の動作が発生しますが、アクセスは問題ありません。aaa[1]

于 2013-08-14T19:04:35.453 に答える
-1

空きメモリへのポインタはありません。最終的に、これはオペレーティング システムによって処理および制御されます。aその時点で、によって使用されているメモリが別のプロセスに割り当てられている可能性があります。

必要な数のポインターを使用できます (つまり、メモリの数だけ)。また、使用済みメモリを指しているかどうかに関係なく、何でも指すことができます。

OS が提供するよりも多くのメモリを割り当てようとすると、new は失敗し、例外が発生します ( std::bad_alloc)。

于 2013-08-14T19:02:20.487 に答える