5

この質問のために、私はメモリをバイトの単純な配列として描写し、動的に割り当てることが可能なヒープ メモリについて話します。

いくつかのクラスをインスタンス化し、いくつかのメモリが既に割り当てられているヒープ上にオブジェクトを作成しているとしましょう。次に、オブジェクトを作成した後、さらにメモリを割り当てます (おそらく別のクラスをインスタンス化することによって)。newもちろん、これはanddeleteキーワードの使用を意味します。

メモリは次のようになります。

... byte byte my_object ... my_object byte byte ...

が実行されると正確に何が起こりdelete my_object;ますか?他のすべてのメモリは だけ左にシフトされsizeof(MyClass)ますか? もしそうなら、誰によって?OS?では、仮想メモリを提供する OS がない場合はどうなるでしょうか。

4

4 に答える 4

6

いいえ、何もシフトされません。代わりに、メモリが断片化されます。つまり、使用済みメモリの途中に未使用の穴ができます。後続の割り当てでは、そのメモリの一部またはすべてを再利用できる場合があります (要求されたバイト数が十分に小さく、穴に収まる場合)。

一部の言語/環境では、ガベージ コレクターの圧縮がサポートされています。このようなコレクターは、オブジェクトを移動することが許可されているため、必要に応じて穴を削除できます。コレクターはプログラム内のすべてのポインターの場所を知る必要があるため、このようなアプローチの実装は複雑です。したがって、このタイプのコレクターは、高水準言語により適しています。

于 2013-01-03T20:03:01.467 に答える
2

メモリがシフトされた場合、それはかなり悪い OS IMO になります。通常、OS には、メモリが再利用可能であることが通知されます。クリアする必要さえありません (ほとんどの場合、クリアする必要はありません)。これ以上メモリを割り当てることができない場合、通常は例外 ( を使用している場合new) または NULL ポインターが返されます ( を使用している場合malloc)。

断片化が懸念される場合 (場合によっては)、独自のメモリプールを作成する必要がありますそれに対処できる(既存の)メモリプールを使用できますが、それでも、ほとんどの責任は依然としてプログラマにあります。

于 2013-01-03T20:03:20.057 に答える
2

メモリは左にシフトされません。だったらどうなるか想像してみてください。「右側」にあるこれらのポインターはすべて無効になります。

于 2013-01-03T20:05:01.070 に答える
1

典型的な実装 (たとえば、移動するガベージ コレクターなし) では、何も移動されません。

Bames53 は Herb Sutter が、割り当てられたオブジェクトの自動移動は違法であると標準で述べていると述べています。ありがとうBames53。

于 2013-01-03T20:04:04.860 に答える